你知道为什么这段代码会导致"Maya不是Maya“吗?
if ("Maya" == "Maya")
printf("Maya is Maya \n");
else
printf("Maya is not Maya \n");发布于 2010-07-22 03:45:26
因为你实际上是在比较两个指针--例如,使用下面的其中一个:
if (std::string("Maya") == "Maya") { /* ... */ }
if (std::strcmp("Maya", "Maya") == 0) { /* ... */ }这是因为C++03,§2.13.4说:
普通字符串文字的类型为“
of n
const char”
..。在您的情况下,将应用到指针的转换。
另请参阅this question,了解为什么在这种情况下不能为==提供重载。
发布于 2010-07-22 03:45:12
您不是在比较字符串,而是在比较指针地址相等性。
更明确地说-
"foo baz bar“隐式定义了一个匿名const char[m]。它是由实现定义的,即相同的匿名const charm是否会指向内存中的相同位置(这个概念被称为interning)。
您想要的函数-在C中-是strmp(char*,char*),它在相等时返回0。
或者,在C++中,您可能会这样做
#include <string>
std::string s1 = "foo"
std::string s2 = "bar"
然后将s1与s2与==运算符进行比较,后者是以一种直观的方式为字符串定义的。
发布于 2010-07-22 03:49:09
程序的输出是由实现定义的。
字符串文字的类型为const char[N] (即,它是一个数组)。程序中的每个字符串是否由唯一的数组表示是由实现定义的。(§2.13.4/2)
在进行比较时,数组会衰减为指针(指向第一个元素),然后进行指针比较。如果编译器决定将两个字符串字面值存储为同一数组,则指针将比较true;如果它们各自有自己的存储空间,则它们将比较false。
要比较字符串的,请使用std::strcmp(),如下所示:
if (std::strcmp("Maya", "Maya") == 0) // same通常,您将使用标准字符串类std::string。它定义了operator==。要使用该运算符,您需要将一个文字设为std::string:
if (std::string("Maya") == "Maya") // samehttps://stackoverflow.com/questions/3303164
复制相似问题