2016-09-17 153 views
1

我比較這兩個字符串時:"code""test"意外的結果比較字符串

當我在Visual Studio中鍵入:

cout<<("t"<"c")<<endl; 
cout<<("c"<"t")<<endl; 
cout<<("code"<"test")<<endl; 
cout<<("test"<"cose")<<endl; 

結果是:

1 
0 
1 
1 

哪些呢沒有任何意義,當我嘗試在ideone.com上嘗試時,結果變爲:

0 
1 
1 
1 

這裏怎麼回事?

回答

4

您正在比較指針值而不是字符串(注意:"cose""code"不同,字面保證提供不同的指針)。

使用<string>標題中的std::string來獲取有意義的字符串操作。

然後你也可以使用文字如"code"s

#include <iostream> 
#include <string> 
using namespace std; 

auto main() -> int 
{ 
    cout << boolalpha; 
    cout << ("t"s < "c"s) << endl; 
    cout << ("c"s < "t"s) << endl; 
    cout << ("code"s < "test"s) << endl; 
    cout << ("test"s < "cose"s) << endl; 
} 

正式在問題的代碼,

cout<<("t"<"c")<<endl; 
cout<<("c"<"t")<<endl; 
cout<<("code"<"test")<<endl; 
cout<<("test"<"cose")<<endl; 

&hellip;具有實現定義的行爲,因爲

C++ 11§5.9/ 2 2 第二破折號(expr.rel):

如果兩個指針p和相同類型的點q到不是同一對象的成員或同一陣列或不同功能的成員的不同對象,或者如果其中只有一個爲空,則不指定p<q,p>qp<=qp>=q的結果。

可以然而,在經由std::less和家庭良好定義的方式這樣的指針比較,因爲

C++ 11 20.8.5/8(比較):

對於模板greaterless,greater_equalless_equal,任何指針類型的專業化都會產生總訂單,即使內置運算符<,><=>=不。

但是,在第三個問題上,儘管指針比較在某些情況下可能有用,但您可能想比較字符串文字。標準庫提供了例如strcmp爲了做到這一點。但最好使用std::string,正如開頭所述。


字面"code"表示char值的不可變空終止字符串。使用最終的空字節,總共有五個char值。因此該類型是char const[5]

作爲在期望指針的上下文中使用的表達式,表示表示該數組的表達式(即,"code"文字)衰減爲指向第一項的指針,char const*指針。

這是數組表達式對指針的通常衰減,但在C++ 03和更早的版本中,文字的特殊規則允許衰減到char*(no const)。


注:
¹兩個相同的字符串文字可以給不同的指針,或相同的指針,這取決於使用的編譯器和選項。

2

字符串文字,例如, "t"實際上是恆定的字符數組(包括終止符)。

當您使用字符串文字時,您所得到的是指向其第一個字符的指針。

所以當你做"t" < "c"你是比較兩個不相關的指針。如果"t" < "c"爲真或取決於編譯器決定放置字符串文字數組的位置。

如果要比較字符串,則應使用std::string或舊的C函數strcmp

+0

「當您使用字符串文字時,您得到的是指向其第一個字符的指針。」這通常是事實,但一般情況並非如此。 –

相關問題