考虑下面的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