如果我使用错误的格式说明符:
unsigned int i = -1;
printf("%d\n", i);
调用未定义的行为,因为%u
的{{1}}格式说明符。
C11标准§7.21.6.1(P9):
如果转换规范无效,则行为为 undefined .282)如果任何参数不是正确的类型 相应的转换规范,行为未定义。
但是,如果我这样写:
unsigned
它是否也是未定义的行为?
答案 0 :(得分:6)
它是否也是未定义的行为?
没有。参数的类型正确。它需要一个有符号整数,并提供一个整数。唯一需要注意的是结果是实现定义的(未定义)。
6.3.1.3 Signed and unsigned integers - p3
否则,新类型已签名且无法表示该值 在里面;结果是实现定义的还是 实现定义的信号被提出。
因此要么会打印某些东西(因为转换发生了),要么会产生一些信号。无论发生什么,您的实施都需要通过记录来通知您。