2014-07-02 274 views
20

爲什麼這個代碼的條件是true爲什麼空字符串文字被視爲true?

int main () 
{ 

    if ("") 
     cout << "hello"; // executes! 

    return 0; 
} 
+14

因爲'「」'是非'NULL'指針。 – Jesper

+6

''「'當表達式計算爲非空地址時,boolean eval-speak中的非null表示非false。 – WhozCraig

+3

其實我沒有看到這個應該這麼低估的原因。這個問題是好的,這是關鍵,代碼顯示作者只需要一個他不知道的答案。爲什麼這麼討厭? –

回答

29

的條件被認爲是「真」,如果它的計算結果爲大於0 *的任何其他。 ""是一個包含單個\0字符的常量字符數組。爲了評估這種情況,編譯器將數組「衰減」爲const char*。由於const char[1]不在地址0處,因此指針非零並且條件滿足。


*更確切地說,如果計算結果爲true後被隱式轉換爲bool。對於簡單類型,這與非零值相同,但對於類類型,您必須考慮是否定義了operator bool()以及它的作用。

從C++ 11規範草案§4.12:

4.12布爾轉化[conv.bool]

算術,無作用域枚舉,指針,或指針的prvalue到成員類型可以 轉換到布爾類型的前值。零值,空指針值, 或空成員指針值被轉換爲false;任何其他值爲 轉換爲true。 std :: nullptr_t類型的前值可以被轉換爲 爲bool類型的前值;結果值是錯誤的。

+11

這是一個'const char [1]'。 – chris

+2

@chris它是,但被評估爲一個條件,它必須轉換爲'const char *',正確嗎? – dlf

+4

是的,它會衰減,但它不是一個開始的指針。由於整個字符串文字是指針,事情是這樣一個常見的誤解,我覺得很重要的是澄清。 – chris

3

因爲""衰減到char const*和是否或何時轉換成布爾所有非空指針評估爲true

0

你可能會從像PHP,這裏的檢查處理不同的語來:

php -r 'echo "X";if ("") echo "Y";' 

這將打印的X,而不是在Y,因爲空字符串沒有價值。如其他人指出的那樣,在C++中它是一個非空指針,因此被評估爲true。

相關問題