2012-05-01 30 views
0

可能重複的:
Is short-circuiting boolean operators mandated in C/C++? And evaluation order?命令,如果條件在運行時執行

考慮以下代碼:

char* str=NULL; 
if(str!=NULL && str[0]=='h') 
    printf("ok"); 

驗證第一個條件是,str是不是NULL。我試圖編譯和運行這段代碼,並且我沒有得到分段錯誤。
這意味着代碼在下一條指令中斷,如果因爲不需要進一步驗證str [0]等於'h',因爲它是和。
但問題是:這是保證與所有編譯器一起工作嗎?不會發生編譯器生成的彙編代碼,出於某種原因,首先驗證str是否等於'h'(導致段錯誤),然後檢查str是否不爲NULL?

+0

這是設計。 – Ste

+0

如果編譯器自己調用標準C編譯器,它必須按照您的說法進行操作。如果沒有,那麼編譯器是越野車。 – pmg

回答

3

是的,這是有保證的。它被稱爲short-circuit evaluation

從C99標準(6.5.13節):

不同於按位二進制&運算符,操作者&&保證左到右的評價; 評估第一個操作數後有一個序列點。如果第一個操作數 的值等於0,則不計算第二個操作數。

類似的規則適用於||;如果第一個操作數爲真,則不評估第二個操作數。

0

是的。這就是它應該如何工作的。