我似乎无法找到相关信息:sprintf
中使用错误的格式说明符是否会导致printf
中的UB?
我也会问这里是否跟随UB?
unsigned int x = 5;
printf("%d",x);
或者这个:
unsigned char x = 5;
printf("%d",x);
答案 0 :(得分:6)
在
sprintf
中使用错误的格式说明符是否会导致printf
中的UB?
是。所有*printf
说明符的定义都相同(实际上在fprintf
部分中)。
我也会问这里是否跟随UB?
unsigned int x = 5; printf("%d",x);
这在技术上是UB。 %d
期望int
参数和"如果任何参数不是相应转换规范的正确类型,则行为未定义。" (WG14 N1570,7.21.6.1/p9;我认为C11与C99相比没有任何改变)。 unsigned int
不是int
。在实践中,你可以逃脱它。
或者这个:
unsigned char x = 5; printf("%d",x);
当且仅当unsigned char
被整数提升提升为int
时,这不是UB,这通常是这种情况。