首页 > 解决方案 > 在 `printf` 中使用标签 `h` 或 `hh` 是否涉及未定义的行为?

问题描述

例如,这样的代码可能很有用:

unsigned char ch = 0xf2;
printf("%02hhx", ch);

但是,在作为可变参数函数的参数传递时ch被提升为。所以在使用的时候,会出现类型不匹配。根据 C 标准,这里是否涉及任何未定义的行为?如果是 C++ 怎么办?intprintf%hhx

这里有一些讨论,但没有给出答案。

标签: c++cprintflanguage-lawyer

解决方案


C11标准说:

7.21.6.1/7 hh指定后面的d, i, o, u, x, 或X转换说明符应用于有符号字符或无符号字符参数(该参数将根据整数提升进行提升,但其值应转换为有符号字符或无符号打印前的字符);或者后面的 n 转换说明符适用于指向有符号字符参数的指针。

所以不,没有未定义的行为。该标准很清楚,char可变参数函数的参数将被提升为int.


推荐阅读