关于C中短数据类型格式说明符的混淆

时间:2015-09-11 16:59:47

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

考虑以下计划:

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

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

1 个答案:

答案 0 :(得分:3)

printf("%hi\n", a);
根据可变参数函数的默认参数提升规则,

a被提升为int

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

当然printf("%i\n", a);int a促销而有效,因此使用%hi转换规范并不常见。