这是否会调用未定义的行为?

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"用于打印无符号类型.这会调用未定义的行为吗?为什么?

CB *_*ley 5

尽管明确允许您使用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.