在 `printf` 中使用标签 `h` 或 `hh` 是否涉及未定义的行为?

use*_*ser 2 c c++ printf language-lawyer

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

unsigned char ch = 0xf2;
printf("%02hhx", ch);
Run Code Online (Sandbox Code Playgroud)

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

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

Igo*_*nik 5

C11标准说:

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

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