在C语言中关于short数据类型格式说明符的混乱

3

考虑以下程序:

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

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

3
printf("%hi\n", a);
a根据变参函数的默认参数提升规则被提升为int。无论如何,由于使用了h说明符,实现可以期望int值在SHRT_MINSHRT_MAX限制内。传递超出界限的值是未定义行为。当然,printf("%i\n",a);也是有效的,因为对a进行了int提升,因此使用%hi转换规范并不常见。

1
@PravasiMeet 参考 C 标准,C99 中请查看 6.5.2.2p7 以了解可变参数函数的提升规则,以及 6.5.2.2p6 以了解默认参数提升。 - ouah
1
错误!C标准只是说(ISO 9899:2011§7.21.6.1¶7#h)“参数将根据整数提升进行提升,但其值在打印之前应转换为short int或unsigned short int”。对我来说,这确实为范围从SHORT_MIN到SHORT_MAX之外的int值指定了明确定义的行为,在这种情况下,行为就像参数被printf转换为signed short / unsigned short一样。 - fuz
@FUZxxl 我不同意! 这不是我的阅读! 全句是“指定下一个d、i、o、u、x或X转换说明符应用于short int或unsigned short int参数(根据整数提升,参数将已被提升,但其值在打印之前应转换为short int或unsigned short int); ” 第一个单词明确表示晋升前的参数为 unsigned short / short - ouah
1
@ouah 嗯...措辞肯定不清楚。让我就此提出一个问题。 - fuz
2
@ouah 让我们看看这个链接(https://dev59.com/qY_ea4cB1Zd3GeqPIwZV)会得出什么结果。 - fuz
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接