Qui*_*tic 5 c undefined-behavior
考虑以下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;
}
Run Code Online (Sandbox Code Playgroud)
在该行中printf("%d %d",a,b);,"%d"用于打印无符号类型.这会调用未定义的行为吗?为什么?
尽管明确允许您使用va_arg宏<stdarg.h>来检索unsigned作为int(7.15.1.1/2)传递的参数,但在(7.19.6.1/9)的文档fprintf中也适用printf,它明确指出如果任何参数都不是格式说明符的正确类型 - 对于未修改的%d,即int- 然后没有定义行为.
作为一个评论@bdonlan指出,如果该值b(在这种情况下,2^N - 1对于一些N)未在所能表述的int那么这将是不确定的行为,试图访问值作为int使用va_arg在任何情况下.这仅适用于unsigned使用至少一个填充位的表示的平台,其中相应的int表示具有符号位.
即使在(unsigned)-1可以用a表示值的情况下int,我仍然将其视为技术上未定义的行为.作为实现的一部分,似乎允许实现使用内置魔术而不是va_args访问参数printf,如果你传递某些东西作为需要的unsigned地方,int那么你在技术上违反了合同printf.