为什么不是(“Maya”==“Maya”)在C ++中是真的?

时间:2010-07-21 19:43:54

标签: c++ string equality

任何想法为什么我因为这段代码而得到“Maya不是Maya”?

if ("Maya" == "Maya") 
   printf("Maya is Maya \n");
else
   printf("Maya is not Maya \n");

8 个答案:

答案 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)