考慮下面的C程序:這是否會調用未定義的行爲?
#include <stdio.h>
int main(){
int a =-1;
unsigned b=-1;
if(a==b)
printf("%d %d",a,b);
else
printf("Unequal");
return 0;
}
在線路printf("%d %d",a,b);
,"%d"
用於打印的無符號類型。這是否會調用未定義的行爲,爲什麼?
7.15的異常.1.1/2的內容如下:「如果 類型與實際下一個參數[...]的類型不兼容,則行爲未定義,但[其中]一種類型是有符號整數類型,另一種類型是對應的無符號整數 類型,並且該值可以在兩個types_「(強調mine)中表示。由於'-1'在兩種類型中都不可表示,所以即使沒有7.19.6.1/9 – bdonlan 2011-05-01 21:42:16
@bdonlan,行爲也是不確定的:從技術上講,'b'沒有值'-1',它的值是'2^N -1'代表一些'N'。這個值是否可以用int和unsigned來表示,取決於平臺 - 通常不是,我授予你。 – 2011-05-01 21:45:12
如果只有某些實現定義的因子爲真時纔會定義某個行爲,則該行爲實際上是未定義的,因爲符合的實現可以自由選擇INT_MAX和UINT_MAX的值,以允許其在有問題的printf調用中召喚鼻子惡魔。 – bdonlan 2011-05-01 21:48:45