任何想法为什么我因为这段代码而得到“Maya不是Maya”?
if ("Maya" == "Maya")
printf("Maya is Maya \n");
else
printf("Maya is not Maya \n");
答案 0 :(得分:48)
因为你实际上正在比较两个指针 - 例如使用以下之一:
if (std::string("Maya") == "Maya") { /* ... */ }
if (std::strcmp("Maya", "Maya") == 0) { /* ... */ }
这是因为C ++ 03,§2.13.4说:
普通字符串文字的类型为“ n
的数组const char
...在您的情况下,转换为指针适用。
另请参阅this question,了解为何在这种情况下无法为==
提供重载。
答案 1 :(得分:18)
您不是在比较字符串,而是在比较指针地址的相等性。
更明确 -
“foo baz bar”隐含地定义了匿名const char[m]
。它是实现定义的,相同的匿名const char [m]是否指向内存中的相同位置(一个概念称为 interning )。
你想要的函数 - 在C中 - 是strmp(char *,char *),它在相等时返回0。
或者,在C ++中,您可能会做的是
#include <string>
std::string s1 = "foo"
std::string s2 = "bar"
然后将s1与s2与==
运算符进行比较,{{1}}运算符以直观的方式定义为字符串。
答案 2 :(得分:9)
程序的输出是实现定义的。
字符串文字的类型为const char[N]
(即,它是一个数组)。程序中的每个字符串文字是否由唯一数组表示是实现定义。 (§2.13.4/ 2)
进行比较时,数组会衰减成指针(到第一个元素),然后进行指针比较。如果编译器决定将两个字符串文字存储为同一个数组,则指针比较为true;如果他们每个人都有自己的存储空间,他们会比较假。
要比较字符串,请使用std::strcmp()
,如下所示:
if (std::strcmp("Maya", "Maya") == 0) // same
通常,您使用标准字符串类std::string
。它定义了operator==
。您需要将其中一个文字设为std::string
才能使用该运算符:
if (std::string("Maya") == "Maya") // same
答案 3 :(得分:8)
您正在做的是将一个字符串的地址与另一个字符串的地址进行比较。根据编译器及其设置的不同,有时相同的文字字符串将具有相同的地址,有时它们不会(显然是您找到的)。
答案 4 :(得分:6)
任何想法为什么我得到“玛雅不是玛雅”的结果
因为在C中,因此在C ++中,字符串文字的类型为const char[]
,当您尝试比较它们时,它会隐式转换为const char*
,指向第一个字符的指针。 指针比较是地址比较。
两个字符串文字是否比较相等取决于您的编译器(使用当前设置)是否汇集字符串文字。允许这样做,但它不需要。 。
要比较C中的字符串,请使用strcmp()
标题中的<string.h>
。 (它是{+ 1}}来自{+ 1}}的C ++。)
要在C ++中这样做,最简单的方法是将其中一个转换为std::strcmp()
(来自<cstring>
标题),它包含所有比较运算符,包括std::string
:< / p>
<string>
答案 5 :(得分:1)
我的编译器说他们 相同; - )
更糟糕的是,我的编译器肯定已经坏了。这个非常基本的等式:printf("23 - 523 = %d\n","23"-"523");
产生
23 - 523 = 1
答案 6 :(得分:1)
C和C ++通过指针比较进行比较;看起来您的编译器正在为字符串“Maya”和“Maya”创建单独的资源实例(可能是由于关闭了优化)。
答案 7 :(得分:1)