gpt4 book ai didi

c - 当 printf 的相应参数不是 short/char 时,使用 h 或 hh 长度修饰符是否非法?

转载 作者:太空狗 更新时间:2023-10-29 16:56:24 24 4
gpt4 key购买 nike

printf 函数族提供了一系列长度修饰符,其中两个是 hh(表示 signed char unsigned char 参数提升为 int) 和 h(表示 signed shortunsigned short 参数提升为 int)。从历史上看,这些长度修饰符只是为了与 scanf 的长度修饰符创建对称而引入的,很少用于 printf

这是 ISO 9899:2011 §7.21.6.1“fprintf 函数”¶7 的摘录:

7 The length modifiers and their meanings are:

  • hh Specifies that a following d, i, o, u, x, or X conversion specifier applies to a signed char or unsigned char argument (the argument will have been promoted according to the integer promotions, but its value shall be converted to signed char or unsigned char before printing); or that a following n conversion specifier applies to a pointer to a signed char argument.

  • h Specifies that a following d, i, o, u, x, or X conversion specifier applies to a short int or unsigned short intargument (the argument will have been promoted according to the integer promotions, but its value shall be converted to short int or unsigned short int before printing); or that a following n conversion specifier applies to a pointer to a short int argument.

  • ...

忽略 n 转换说明符的大小写,这些几乎相同的段落对 hhh 的行为说了什么?

  • this answer , 据称传递的参数超出了 signed charsigned shortunsigned charunsigned短 响应。对于带有 hhh 长度修饰符的转换规范。是 未定义的行为, 因为参数不是从 charshort 等类型转换而来的。之前。
  • 我声称该函数以明确定义的方式为 int 类型的每个值运行,并且 printf 的行为就好像参数已转换为 char short 等。转换前。
  • 也可以声称在默认参数提升之前使用不属于相应类型的参数调用函数是未定义的行为,但这看起来很深奥。

§7.21.6.1¶7 的这三种解释中哪一种(如果有的话)是正确的?

最佳答案

标准规定:

If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.

[C2011 7.21.6.1/9]

“正确的类型”的含义是可以理解的,但对我来说最合理的解释是转换规范“适用于”的类型,如前文所述,并在部分,在问题中。我将关于参数提升的括号评论视为承认普通参数传递规则,并避免这些函数是特殊情况的任何暗示。我不认为括号中的注释与确定参数的“正确类型”有关。

如果您传递一个比转换规范正确的类型更宽的参数,实际会发生什么是另一个问题。我倾向于相信 C 系统不太可能被任何人实现,以至于 printf() 参数实际上是一个 char,还是是一个 int,其值在 char 范围内。然而,我断言编译器检查参数类型与格式的对应关系并在不匹配时拒绝程序是有效的行为(因为在这种情况下所需的行为是明确未定义的)。

另一方面,我当然可以想象 printf() 实现如果参数值超出相应的转换说明符。由于行为未定义,这也是允许的。

关于c - 当 printf 的相应参数不是 short/char 时,使用 h 或 hh 长度修饰符是否非法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32529239/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com