2016-01-21 80 views
1

我碰到過一段代碼。我想知道爲什麼下面的代碼將x的值返回爲4而不是0。三元opertor輸出

if(2<1); 
else x = (2<0) ? printf("one") : printf("four"); 
printf("%d",x); 

輸出爲4

+1

你爲什麼認爲它應該設置爲'0'? 'printf()'返回打印的字符數,所以它應該是'3'或'4'。 – Barmar

回答

3

printf函數返回打印的字符數。

因爲在這種條件運算

(2<0)?printf("one"):printf("four") 

條件(2<0)是假這個表達式printf("four")被評估和其值等於4 - 的outputed的字符數。

從功能printf的描述(該C標準,7.21.6.3 printf函數)

3 printf函數返回發送字符 的如果一個輸出或數量,或負值編碼錯誤 發生。

我認爲混淆的原因是 條件運算符之前的賦值運算符。然而,與條件運算符相比,賦值運算符的優先級較低。所以實際上你有

else x = ((2<0) ? printf("one") : printf("four")); 
+0

但我認爲x = 2 <0具有x =假值,即x = 0,然後它轉到printf並賦值爲4 ..這是一個棘手的問題 – niks

+1

@niks三元運算符中的條件是邏輯或表達式比分配操作員具有更高的優先級。 –

4

的請,而不是試圖讀取不可讀,使其可讀,享受

if (2 < 1); 
else 
    x = (2 < 0) ? printf("one") : printf("four"); 
printf("%d", x); 

當然2 < 1的是假的,2 < 0是假再這樣了返回值printf("four")這就是4,因爲"four"有4個字符被分配到"x"

因此,輸出應爲

four4 
+0

爲什麼在'if'之後有';'?它不會抱怨爲'else'丟失了'if'嗎? –

+0

@SouravGhosh它是在原始代碼中,它並不重要,因爲它是一個「*空*」語句。 –

+0

@SouravGhosh也沒關係,因爲它直接繼續'else' –