[visual-studio]打印 int 变量与浮点格式说明符

标签: Visual-Studio
发布时间: 2014/3/1 4:07:17
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.
int main()
{
    int a=5;
    float b=7.5;

    printf("%d %f\n",a,b);
    printf("%d %f\n",a,a);

    return 0;
}

当我将这编译 gcc 编译器输出中是

5 7.500000
5 7.500000

但当在 visual studio 中,输出是

5 7.500000
5 0.000000

我不能理解 gcc 编译器输出。

解决方法 1:

printf原型是:

int printf(const char *format, ...);

C11 (n1570) § 6.5.2.2 函数调用

在函数原型声明符的省略号表示法会导致停止后最后一次声明参数的参数类型转换。对尾随参数执行的默认参数提升。

C11 (n1570) § 6.5.2.2 函数调用

对每个参数,执行整数促销和浮点类型的参数被提升到双。这些被称为默认参数促销活动。

因此,没有其他参数促销执行与 printf 调用。尤其是, a 不会转换为 double 。因此它将导致未定义的行为: printf 将试图获取 double 与给定的大小 ( sizeof(double) ) 和一个给定的内存表示,可能是不同的 int

C11 (n1570)、 § 7.21.6.1 fprintf 函数

如果转换规范是无效的则行为是未定义。如果任何参数不是对应的转换规范为正确的类型,则行为是未定义。

此外,你可以看看由海湾合作委员会,看看什么生成的 ASM 代码。

官方微信
官方QQ群
31647020