以下代码打印
1
0
我一直想知道如果比较使用相同的字符串,为什么值会有所不同......我一直在努力解决这个问题,并且无法弄清楚为什么它们会返回不同的布尔值。
int main()
{
string stringArray[] = { "banana","Banana","zebra","apple","Apple","Zebra","cayote" };
cout << (stringArray[1] < stringArray[0]) << endl;
cout << ("Banana" < "banana") << endl;
return 0;
}
答案 0 :(得分:16)
stringArray[n]
是std::string
,但"Banana"
是字符串文字(char
s的数组)。
执行"Banana" < "banana"
时,两个字符串文字都会隐式转换为指向char
数组的char
指针。 <
然后比较这些内存地址。
答案 1 :(得分:8)
"Banana" < "banana"
没有比较字符串的内容。它正在比较"Banana"
和"banana"
解析的指针。
要比较cstyle字符串而不将其转换为std::string
,您可以使用strcmp()
。
答案 2 :(得分:7)
string stringArray[] = { "banana","Banana","zebra","apple","Apple","Zebra","cayote" };
这意味着您将获得一堆std::string
个对象,这些对象是从char const*
创建的,这些对象来自各个字符串文字。
考虑单个std::string
初始化:
std::string s = "...";
右侧的文字属于char const[4]
类型。它“衰减”为char const*
构造函数使用的std::string
。
从字符串文字初始化std::string
个对象数组时会发生同样的情况。
cout << (stringArray[1] < stringArray[0]) << endl;
对于std::string
,使用<
运算符表示词典比较。因此,这使用词典比较并具有预期的结果。
cout << ("Banana" < "banana") << endl;
在这种情况下,不涉及std::string
。您将两个char const[7]
相互比较。
这是什么意思?事实证明,这是完全不同的事情。两个数组都“衰减”到char const*
到它们的第一个元素。将两个不相关的指针与<
进行比较的结果是未指定。你很幸运收到0因为你可能会收到1并且没有注意到错误。编译器也可以为此生成警告,例如:
warning: comparison with string literal results in unspecified behaviour
因此,正如您所看到的,此操作与词典比较完全无关。
解决此问题的一种方法是将至少一个操作数转换为std::string
:
cout << (string("Banana") < "banana") << endl;
<
和std::string
之间的char const*
比较(反之亦然)被定义为词典编纂。