#include<stdio.h>
int main(){
unsigned int a = 6;
int b = -20;
(a+b > 6) ? puts("a") : puts("b");// if a+b > 6 then a else b
}
我推測輸出應該是「b」,但它不是。任何人都可以請解釋下面的C程序的輸出?
輸出:一個
#include<stdio.h>
int main(){
unsigned int a = 6;
int b = -20;
(a+b > 6) ? puts("a") : puts("b");// if a+b > 6 then a else b
}
我推測輸出應該是「b」,但它不是。任何人都可以請解釋下面的C程序的輸出?
輸出:一個
C99標準,節6.3.1.8
如果具有無符號整數類型的秩爲操作數大於或等於另一個操作數的類型的秩,則帶符號整數類型的操作數被轉換爲無符號整數類型的操作數的類型。
所以這裏b
(值= -20)轉化爲unsigned type
(大的值)時,將相當於 -
(a+(unsigned int)b > 6)
因此,輸出是未a
b
的表達式a + b
的類型是unsigned int
,它是每當在不同類型的操作數上使用算術運算符時應用的算術轉換的結果。每個操作數首先轉換爲該公共類型,並且將-20
轉換爲unsigned int
的結果是非常大的值。
已經有很多重複的混合簽名無符號算術和比較在這裏,但我現在找不到 –
[Duplicate](http://stackoverflow.com/questions/17312545/type-conversion-unsigned-以簽署-INT-字符)。另外,我相信'?:'的第二個和第三個操作數必須是算術或指針類型。 – Lundin
@Lundin:肯定 - 但'puts'確實[返回一個值](http://en.cppreference.com/w/c/io/puts)。 – usr2564301