2013-02-21 80 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