2014-03-28 87 views
1

我試着ideone.com以下測試爲什麼abs(1.5)在ideone.com上返回0而不是1或2?

(注:我的本地機器不給這個問題)

#include <stdio.h> 

int main(void) { 
    float f = abs(2); printf("%f \n", f); // 2.000000 
    float g = abs(1.5); printf("%f \n", g); // 0.000000 

    return 0; 
} 

原型爲ABS是 '詮釋ABS(INT)'

因此我預計g會返回1或2;我期望將'1.5'轉換爲整數。 http://ideone.com/reyITY

有人能解釋這種現象:

這可以在ideone.com證明?

PS我知道我應該使用晶圓廠(或fabsf?),但無論如何,我想明白爲什麼這打破了它

+0

'float f = abs(2.0f);'也返回'0.0000',所以我猜編譯器不喜歡做那個轉換 –

+0

@Pi可能你的編譯器不知何故和某些爲什麼包括'stdlib.h'包括'stdio.h',而他們沒有。所以最好做對,幷包括你需要的東西。另請參見[本示例](http://ideone.com/X3V7cf)。 – glglgl

+0

@glglgl顯然是鏗鏘的......這首先困惑了我,所以對於鏗鏘聲來說,這是一種轉換。 –

回答

6

absstdlib.h聲明的方式。只是包括它。

您的編譯器應該抱怨abs未被聲明。如果不是,請添加合適的標誌或開關。

10

您沒有包括<stdlib.h>,其中聲明abs

這意味着調用abs(1.5);,編譯器假定某個地方有一個int abs(double)函數,它將生成調用該函數的代碼。

參數不匹配(int vs double),所以你會得到未定義的行爲。

+0

但它不應該報告錯誤,它不能找到任何'int abs(double)'符號? –

+1

@Pi不,C會接受。缺少原型不是錯誤,只有符號名稱很重要,而不是鏈接時的類型/參數。 (imo,總是啓用編譯器標誌,使得缺少原型的錯誤,或者至少是一個警告) – nos

+0

@Pi'gcc'會爲此產生一個警告,不管你使用哪個標誌,不幸的是它好像是'clang'帶' stdlib.h'與'stdio',但如果你刪除它,那麼它也會產生一個警告,無論使用哪個標誌。 Visual Studio另一方面不會產生錯誤。 –

相關問題