2010-09-28 462 views
4

看代碼:賦值和比較

int i = 5; 
if (i = 0) 
{ 
    printf ("Got here\n"); 
} 

什麼是C標準必須說什麼會得到印? 或者更一般地說,這個任務是先發生還是比較?

+0

您擔心哪種分配。還要注意沒有比較(用==完成) – 2010-09-29 03:20:06

回答

10

§6.8.4說,對一個if選擇語句的語法是:

if (expression) statement

此外,在本節中,它提到,如果表達式相比較不等於0,則statement被執行。因此,必須對錶達式進行評估,然後才能將其與0進行比較。i = 0是一個評估爲0的表達式。有關進一步參考,請參見§6.5「關於§6.5.16「的表達式」指定運算符」,特別注意此摘錄:

賦值運算符將值存儲在由左操作數指定的對象中。賦值表達式在賦值後具有左操作數的值,但不是左值。

1

分配發生,它返回一個0,這是錯誤的。

5

先分配,因爲它是評估的一部分。賦值的表達式返回賦值,所以表達式的計算結果爲false。

+0

對標準的任何引用? – doron 2010-09-28 21:51:55

+1

我不知道你想引用的標準的哪一部分...賦值是表達式,並且'if'必須在確定表達式的真值之前(根據定義)評估它的表達式。 – rmeador 2010-09-28 22:03:59

0

的if語句被首先計算,其結果是表達0

此程序將永遠不會打印「在這裏\ n得到了」。

3

i=0評估爲0,因此輸出不會發生。

事先分配(源代碼的第一行)與結果無關。

+0

是的,我檢查了真相。如果我在比較之前將其設置爲零,那麼我們不打印在這裏,如果比較首先發生,我們會這樣做。 – doron 2010-09-28 21:50:55

+0

@doron - 向我顯示哪一行代碼是比較結果,我將相應地進行編輯。感謝 – 2010-09-28 21:55:54

+0

C標準規定表達式本身與0進行比較,並且只有當表達式比較不等於0時才執行if語句的子語句。我認爲@doron想知道比較是發生在在分配之前。 – dreamlax 2010-09-28 22:11:35

2

語句i = 0將被評估並返回0,因此語句不會被打印。

0

正如其他人已經說過的,賦值返回賦值的值,所以從不打印語句。如果您想要打印報表,則必須使用if (i = -1)

0

什麼都不會打印。將0分配給i,然後對該條件進行測試。

2

當分配發生時是無關緊要的。與i=0相關的值是一個表達式,它的值定義爲0。