【问题标题】:confusion about short data type format specifier in C关于 C 中短数据类型格式说明符的混淆
【发布时间】:2015-12-08 07:36:06
【问题描述】:

考虑以下程序:

#include <stdio.h>
int main()
{
    short a=9;
    //printf("%hi\n",a);
    printf("%d",a);  // LINE 6
}

根据this,短类型(有符号)的格式说明符是%hi short 类型变量是否总是在对其执行任何操作之前自动提升为 int?是未定义的行为, 如果我使用 %d 格式说明符来打印该程序中变量的值?我使用 gcc -Wall -Wextra -WFormat 选项编译它,但仍然 编译器没有显示任何警告。为什么?

【问题讨论】:

    标签: c undefined-behavior short format-specifiers type-promotion


    【解决方案1】:
    printf("%hi\n", a);
    

    a 被提升为int 根据可变参数函数的默认参数提升规则。

    无论如何,当您使用 h 说明符时,允许实现预期 int 值在 SHRT_MINSHRT_MAX 限制内。将值传递到边界之外是未定义的行为。

    当然printf("%i\n", a); 也是有效的,因为aint 提升所以使用%hi 转换规范不是很常见。

    【讨论】:

    • 在哪里可以找到可变参数函数的默认参数提升规则。 ?
    • @PravasiMeet 参见 C 标准,在 C99 中参见 6.5.2.2p7 了解可变参数函数的提升规则和 6.5.2.2p6 了解默认参数提升。
    • 错误! C 标准只说(ISO 9899:2011§7.21.6.1¶7#h)“参数将根据整数提升进行提升,但其值应在打印前转换为短整型或无符号短整型”对我来说,这确实为int 的值在SHORT_MINSHORT_MAX 的范围之外明确指定了定义的行为,其中行为就好像参数在打印之前由printf 转换为signed short/unsigned short
    • @ouah 嗯...措辞肯定不清楚。让我问一个关于这个的问题。
    • @ouah 让我们看看this 的结果。
    猜你喜欢
    • 2012-09-06
    • 1970-01-01
    • 2012-10-06
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 2017-12-24
    相关资源
    最近更新 更多