以下代码来自文章C++ quirks, part 198276
include <iostream>
#include <string>
using namespace std;
int main()
{
std::string a = "\x7f";
std::string b = "\x80";
cout << (a < b) << endl;
cout << (a[0] < b[0]) << endl;
return 0;
}
令人惊讶的是output是
1
0
不应该字符串比较是字典吗?如果是,如何解释输出?
答案 0 :(得分:2)
C ++规范中没有任何内容可以说char
是signed
还是unsigned
,它取决于编译器。对于您的编译器,似乎char
默认为signed char
,这就是第二次比较返回false
的原因。
答案 1 :(得分:2)
所以我要直接引用your link:
事实证明,标准需要这种行为,在第21.2.3.1节[char.traits.specializations.char]中:“两个参数成员eq和lt应该与内置运算符相同地定义= =和&lt;对于unsigned char类型。“
所以:
(a < b)
需要使用unsigned char
比较。(a[0] < b[0])
需要使用char
比较,可能会签名也可能不签名。