2013-12-18 23 views
2

案例1: printf("%f",(7/2));在gcc中的输出是0.000000。printf在gcc中的错误结果

案例2: float k= 7/2; printf("%f",k);在gcc输出是3.000000。

在第一种情况下,printf预计浮点数,但得到整数,所以给出错误的结果。但在第二种情况下,它会进行类型转换。

这里是我的问题 -

  1. 为什么不给gcc的类型不匹配的错误/警告在第一种情况?
  2. 在第二种情况下,它默认进行类型转换,但为什么不在第一种情况下?

回答

3

1)GCC不通过默认勾选类型的格式字符串参数 - 所以“interpretes”的数据(即。在运行时

2)的整数)作为浮动GCC现在interpretes浮子作为浮子在运行时

6

第二种情况是默认进行类型转换,但为什么不在第一种情况下?

在第一种情况下72都是int类型。除以72将给你一个int。用%f打印它将调用未定义的行为。你会得到任何东西。在这种情况下,没有类型转换。

尝试此

printf("f", (7.0/2)); 

在第二种情况下是k类型float因此的7/2将结果转换到默认的类型的k的。

为什么gcc在第一种情况下给出类型不匹配错误/警告?

编译与-Wall标志的第一个语句被给予警告:

[Warning] format '%f' expects argument of type 'double', but argument 2 has type 'int' [-Wformat=] 
+4

这不是我正在寻找的答案。请仔细阅读我的问题。 :) – alienCoder

+0

@alienCoder;对不起。现在编辑。查看编辑。 – haccks

3

GCC可以发出警告,但您没有启用它。尝试编译与国旗-Wall,你会看到:

warning: double format, different type arg (arg 2)