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

ray*_*ond 23 c++ string equality

任何想法为什么我得到"玛雅不是玛雅"这个代码的结果?

if ("Maya" == "Maya") 
   printf("Maya is Maya \n");
else
   printf("Maya is not Maya \n");
Run Code Online (Sandbox Code Playgroud)

Geo*_*che 48

因为你实际上在比较两个指针 - 例如使用以下之一:

if (std::string("Maya") == "Maya") { /* ... */ } 
if (std::strcmp("Maya", "Maya") == 0) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

这是因为C++ 03,§2.13.4说:

普通字符串文字的类型为" n的 数组const char"

...在您的情况下,转换为指针适用.

另请参阅此问题,了解为何不能==为此情况提供重载.

  • C++ - SO上唯一的语言,其中章节,段落和诗句经常被引用. (37认同)
  • @Georg:不打扰我,我希望其他语言社区有那么精确.但它确实让我很开心. (5认同)
  • @Paul:嘿,但它也是少数几种不遵循标准的语言之一,可以解决一些重大问题. (3认同)
  • 没有很多其他语言具有多个稳定实现 - 在没有单一主导实现的情况下甚至更少.我假设C问题也引用了很多标准? (2认同)

Pau*_*han 18

您不是在比较字符串,而是在比较指针地址的相等性.

更明确 -

"foo baz bar"隐含地定义了一个匿名者const char[m].它是实现定义的,相同的匿名const char [m]是否指向内存中的相同位置(一种称为实习的概念).

你想要的函数 - 在C中 - 是strmp(char*,char*),它在相等时返回0.

或者,在C++中,您可能会做的是

#include <string>

std::string s1 = "foo"

std::string s2 = "bar"

然后将s1与s2与==运算符进行比较,运算符以直观的方式定义为字符串.

  • 文字定义了一个`const char [N]`,而不是`const char*`. (4认同)

GMa*_*ckG 9

程序的输出是实现定义的.

字符串文字具有类型const char[N](即,它是一个数组).程序中的每个字符串文字是否由唯一数组表示是实现定义的.(§2.13.4/ 2)

进行比较时,数组会衰减成指针(到第一个元素),然后进行指针比较.如果编译器决定将两个字符串文字存储为同一个数组,则指针比较为true; 如果他们每个人都有自己的存储空间,他们会比较假.

要比较字符串,请使用std::strcmp(),如下所示:

if (std::strcmp("Maya", "Maya") == 0) // same
Run Code Online (Sandbox Code Playgroud)

通常你会使用标准的字符串类std::string.它定义了operator==.您需要创建一个文字std::string来使用该运算符:

if (std::string("Maya") == "Maya") // same
Run Code Online (Sandbox Code Playgroud)


Gab*_*abe 8

你要做的是将一个字符串的地址与另一个字符串的地址进行比较.根据编译器及其设置,有时相同的文字字符串将具有相同的地址,有时它们不会(显然你发现).


sbi*_*sbi 6

任何想法为什么我得到"玛雅不是玛雅"的结果

因为在C中,因此在C++中,当您尝试比较它们时,字符串文字是类型const char[],它被隐式转换为const char*指向第一个字符的指针.指针比较是地址比较.
两个字符串文字是否比较相等取决于您的编译器(使用当前设置)是否汇集字符串文字.允许这样做,但它不需要..

比较C字符串,用strcmp()<string.h>头部.(它std::strcmp()来自<cstring>C++.)

要在C++中这样做,最简单的方法是将其中一个转换为std::string(来自<string>标题),它带有所有比较运算符,包括==:

#include <string>

// ...

if (std::string("Maya") == "Maya") 
   std::cout << "Maya is Maya\n";
else
   std::cout << "Maya is not Maya\n";
Run Code Online (Sandbox Code Playgroud)