#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
,但它的 輸出爲>6
。C中的帶符號整數
#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
,但它的 輸出爲>6
。C中的帶符號整數
從C99標準,節6.3.1.8(「通常的算術轉換」):
如果具有無符號整數類型操作數的秩大於或等於 到另一類型的秩操作數,則帶符號整數類型的操作數 將轉換爲操作數的類型,其中無符號整數類型爲 。
基本上,在你的示例代碼,案件unsigned int
和int
具有相同的等級,所以它等同於:
(a + (unsigned int)b > 6)
爲了解決這個問題,就需要在其他方向明確投,即:
((int)a + b > 6)
答案是在部分C99標準,這有利於無符號類型的「6.3.1.8通常的算術轉換」被發現當有符號類型和無符號上e被傳遞給二元運算符(現實情況比這更微妙)。
查看this blog post作爲通過6.3.1.8的規則工作的另一個例子。
您在代碼中混合了有符號和無符號整數。那是一個壞事。試試下面的代碼片段:
int main()
{
unsigned int a = 0;
int b=-20;
printf("(a + b) = %f", (a + b));
return 0;
}
不要混合符號和無符號整數,因爲編譯器會做一個沉默的轉換隻是當你不希望它。
請注意,使用'?:'有條件地調用函數被認爲是不好的做法。 –
@Oli爲什麼呢? – IronMensan
@Iron:因爲?:是一個操作符,該語句是一個*表達式*並且有一個值(在這裏被忽略)。它不等於if-else。 – Clifford