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