您正在比較指針值而不是字符串(注意:"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>q
,p<=q
和p>=q
的結果。
可以然而,在經由std::less
和家庭良好定義的方式這樣的指針比較,因爲
C++ 11 20.8.5/8(比較):
」對於模板greater
,less
,greater_equal
和less_equal
,任何指針類型的專業化都會產生總訂單,即使內置運算符<
,>
,<=
,>=
不。
但是,在第三個問題上,儘管指針比較在某些情況下可能有用,但您可能想比較字符串文字。標準庫提供了例如strcmp
爲了做到這一點。但最好使用std::string
,正如開頭所述。
字面"code"
表示char
值的不可變空終止字符串。使用最終的空字節,總共有五個char
值。因此該類型是char const[5]
。
作爲在期望指針的上下文中使用的表達式,表示表示該數組的表達式(即,"code"
文字)衰減爲指向第一項的指針,char const*
指針。
這是數組表達式對指針的通常衰減,但在C++ 03和更早的版本中,文字的特殊規則允許衰減到char*
(no const
)。
注:
¹兩個相同的字符串文字可以給不同的指針,或相同的指針,這取決於使用的編譯器和選項。
「當您使用字符串文字時,您得到的是指向其第一個字符的指針。」這通常是事實,但一般情況並非如此。 –