std :: string比较,lexicographical或不

时间:2014-04-21 14:09:17

标签: c++ string

以下代码来自文章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

不应该字符串比较是字典吗?如果是,如何解释输出?

2 个答案:

答案 0 :(得分:2)

C ++规范中没有任何内容可以说charsigned还是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比较,可能会签名也可能不签名。