2014-04-21 41 views
3

下面的代碼,來自於文章C++ quirks, part 198276的std :: string比較,辭書或不

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

您是否閱讀過網站上給出的解釋?那個解釋怎麼樣對你沒有意義? –

+0

@sharth這似乎違反了[字典比較](http://en.wikipedia.org/wiki/Lexicographical_order)是什麼;無論是數學還是編程概念。問題在於,_字符串比較不應該是字典式的嗎?_爲什麼需要重寫一個完善的定義?我們是否應該在標準中出現「詞典」時擔心,我是否擔心過一個例外。我的意思是,當圍繞一個堅實的概念繞道而行時,關注的分類標準已經發生了變化。 –

+0

請注意[字典順序](http://en.wikipedia.org/wiki/Lexicographical_order)不是[按字母順序](http://en.wikipedia.org/wiki/Alphabetical_order)。我們按字典順序排列字符串。要按字母順序對它們進行排序,您需要有關字符編碼的信息。一個'std :: string'不存儲關於這個的任何信息,這意味着它不知道字符串中的特定字符是'A'還是'''。 –

回答

2

如果charsignedunsigned,C++規範中沒有什麼可說的,它取決於編譯器。對於你的編譯器,看起來char默認爲signed char這就是爲什麼第二個比較返回false

+0

我嘗試了小於7F的數字,並得到了兩個相同的結果。你的解釋似乎很完美。 – vishram0709

2

所以我只是要直接從your link報價:

事實證明,這種行爲是標準所要求的,在第21.2.3.1 [char.traits.specializations.char]:「這兩個參數的成員EQ和LT應當相同定義爲內置的運算符==和< unsigned char類型「

這樣:

  • (a < b)需要使用unsigned char比較。
  • (a[0] < b[0])需要使用char比較,可能會或可能不會被簽名。