使用float格式说明符打印int变量

时间:2013-06-14 08:20:11

标签: c visual-studio gcc floating-point printf

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 个答案:

答案 0 :(得分:3)

printf原型是:

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

C11(n1570),§6.5.2.2函数调用

  

函数原型声明符中的省略号表示法导致   参数类型转换在最后声明的参数后停止。 默认参数   促销是在尾随参数上执行的。

C11(n1570),§6.5.2.2函数调用

  

对每个参数和参数执行整数提升   将float类型提升为double。这些被称为默认参数   促销。

因此,printf调用不会执行其他参数提升。特别是,a未转换为double。因此,它将导致未定义的行为:printf将尝试获取具有给定大小(double)的sizeof(double)和给定的内存表示,这可能与{{1}不同}}

C11(n1570),§7.21.6.1int函数

  

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

此外,您可以查看 gcc 生成的ASM代码,了解正在发生的事情。