2013-02-21 81 views
2

我的针对我便无法理解这个输出的原因的几行代码..原因为以下代码的输出:

int main() 
{ 
int a=5; 
float b=10.5,c=11.0; 
printf("%d",b); 
printf("\n%d",c); 
printf("\n%f",a); 
return 0; 
} 

O/P在Visual C++: - 0, 0,0.000000

gcc编译器: - 0,0,11.000000

回答

10

当您拨打像printf这样的可变参数功能时,float会升级至doubleint s按原样传递。因此当您编写%f时需要double,当您编写%d时需要int

不给它double,但是int,因此是未定义的行为。同样,在函数期望int时传递double也是未定义的。

像往常一样,未定义的行为意味着“任何事情都可能发生”。永远不要依赖未定义的行为。

+0

优秀的解释,谢谢不会有比这更好的解释.. :) – user1606191 2013-02-21 12:38:34

4

你玩未定义或不确定的行为。不知道他们中的哪一个。在我的Debian上使用gcc 4.7.2,输出结果为-780714744,4195886,11.000000。

+1

+1,所有这些都是未定义的。 (a)将一个float发送给一个期望int的格式规范,(b)与(a)相同,最后(c)发送一个'int'给一个'float'期望的spec-string。他们都*错了,UB。 – WhozCraig 2013-02-21 07:45:02