sprintf未定义的行为

时间:2014-07-14 21:21:49

标签: c++ c

我似乎无法找到相关信息:sprintf中使用错误的格式说明符是否会导致printf中的UB?

我也会问这里是否跟随UB?

unsigned int x = 5;
printf("%d",x);

或者这个:

unsigned char x = 5;
printf("%d",x);

1 个答案:

答案 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,这通常是这种情况。