2013-12-18 19 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)