【问题标题】:Does using tag `h` or `hh` in `printf` involves undefined behaviour?在 `printf` 中使用标签 `h` 或 `hh` 是否涉及未定义的行为?
【发布时间】:2020-04-01 07:00:39
【问题描述】:

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

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

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

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

【问题讨论】:

  • 没有类型不匹配。 printf() 中的 hhx 代码将 int 转换为 unsigned char 并从那里继续。
  • 你在说什么“类型不匹配”? printf 完全了解默认参数提升。而%hhx 需要一个int 参数。 %hhx 仅影响输出规范,但它接收的参数仍然是 int。
  • ch 在UCHAR_MAX>INT_MAX 时可以提升为unsigned int。这意味着sizeof(int)==1,因此它并没有真正被提升,因为在这样的系统上unsigned char 将与unsigned int 相同。

标签: c++ c printf language-lawyer


【解决方案1】:

C11 标准说:

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

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

【讨论】:

    猜你喜欢
    • 2011-06-02
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多