为什么 const char[] 和 const char* 的比较不同?

5

假设我有以下代码:

const char str1[] = "asdasd";
const char str2[] = "asdasd";
const char* str3 = "dsadsa";
const char* str4 = "dsadsa";
if (str1 == str2)
{
    cout << "str1 == str2" << endl;
}
if (str3 == str4)
{
    cout << "str3 == str4" << endl;
}

结果是 "str3 == str4"。为什么?

选择合并/汇集字符串的不同编译器选项,然后str3 != str4 - PaulMcKenzie
比较指针有什么意义?这段代码的目的是什么? - πάντα ῥεῖ
请注意,如果它不是const,会发生什么。 - Michael Chourdakis
2个回答

10

对于C++

str3str4指向相同的字符串字面值

编译器允许但不要求合并相等或重叠的字符串字面值。这意味着当通过指针比较相同的字符串字面值时,它们可能相等也可能不相等。

这意味着str3 == str4true还是false未指定的,它取决于实现,而您正在使用的实现给出了true

另一方面,str1str2是独立的数组。

字符串字面值可用于初始化字符数组。如果像char str[] = "foo";这样初始化数组,则str将包含字符串"foo"的副本。

因此,str1 == str2保证为false


1
这意味着[结果]是实现定义的,也就是说它取决于实现。标准中的“实现定义”意味着实现必须记录其行为。我不知道字符串字面值有任何这样的要求。 - Pete Becker
@PeteBecker 你是对的;应该是未指定的 - songyuanyao

5

字符串字面量共享池。编译器倾向于合并相同的字符串字面量,这样程序中只有一个副本。虽然这是被允许但不是必需的;依赖此操作是不明智的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接