2011-08-28 68 views
3
#include<stdio.h> 

int main() 
{ 
    unsigned int a=6; 
    int b=-20; 
    (a+b>6)?puts(">6"):puts("<=6"); 
    return 0; 
} 

以上代碼輸出>6。但我有疑問。 b=-20將在執行2的補碼後保留負值(-18) ,因爲它是一個有符號整數。所以它應該輸出<=6,但它的 輸出爲>6C中的帶符號整數

+4

請注意,使用'?:'有條件地調用函數被認爲是不好的做法。 –

+1

@Oli爲什麼呢? – IronMensan

+0

@Iron:因爲?:是一個操作符,該語句是一個*表達式*並且有一個值(在這裏被忽略)。它不等於if-else。 – Clifford

回答

9

從C99標準,節6.3.1.8(「通常的算術轉換」):

如果具有無符號整數類型操作數的秩大於或等於 到另一類型的秩操作數,則帶符號整數類型的操作數 將轉換爲操作數的類型,其中無符號整數類型爲 。

基本上,在你的示例代碼,案件unsigned intint具有相同的等級,所以它等同於:

(a + (unsigned int)b > 6) 

爲了解決這個問題,就需要在其他方向明確投,即:

((int)a + b > 6) 
1

答案是在部分C99標準,這有利於無符號類型的「6.3.1.8通常的算術轉換」被發現當有符號類型和無符號上e被傳遞給二元運算符(現實情況比這更微妙)。

查看this blog post作爲通過6.3.1.8的規則工作的另一個例子。

1

您在代碼中混合了有符號和無符號整數。那是一個壞事。試試下面的代碼片段:

int main() 
{ 
    unsigned int a = 0; 
    int b=-20; 
    printf("(a + b) = %f", (a + b)); 
    return 0; 
} 

不要混合符號和無符號整數,因爲編譯器會做一個沉默的轉換隻是當你不希望它。

相關問題