我的針對我便無法理解這個輸出的原因的幾行代碼..原因爲以下代碼的輸出:
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
我的針對我便無法理解這個輸出的原因的幾行代碼..原因爲以下代碼的輸出:
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
當您撥打像printf
這樣的可變參數功能時,float
會升級至double
。 int
s按原樣傳遞。因此當您編寫%f
時需要double
,當您編寫%d
時需要int
。
不給它double
,但是int
,因此是未定義的行爲。同樣,在函數期望int
時傳遞double
也是未定義的。
像往常一樣,未定義的行爲意味着「任何事情都可能發生」。永遠不要依賴未定義的行爲。
你玩未定義或不確定的行爲。不知道他們中的哪一個。在我的Debian上使用gcc 4.7.2,輸出結果爲-780714744,4195886,11.000000。
+1,所有這些都是未定義的。 (a)將一個float發送給一個期望int的格式規範,(b)與(a)相同,最後(c)發送一個'int'給一個'float'期望的spec-string。他們都*錯了,UB。 – WhozCraig 2013-02-21 07:45:02
優秀的解釋,謝謝不會有比這更好的解釋.. :) – user1606191 2013-02-21 12:38:34