簡體   English   中英

為什么(double + int)的結果為0(C語言)

[英]why result of (double + int) is 0 (C language)

的結果

printf("%d\\n", 5.0 + 2);

是0

int num = 5.0 + 2;
printf("%d\n", num);

是7

這兩者有什么區別?

5.0 + 2的結果是7.0並且是double類型。

"%d"格式是打印int

不匹配的格式規范和參數類型會導致未定義的行為

要使用printf打印floatdouble值,您應使用格式"%f"


int num = 5.0 + 2;

您將5.0 + 2的結果轉換為int7 然后使用正確的格式說明符打印int值。

在所有表達式中,每個操作數都有一個類型。 5.0double類型。 2int類型。

只要double和integer用作同一運算符的操作數,整數就會在計算之前以無提示方式轉換為double。 結果是double類型。

因此你將double傳遞給printf ,但是你告訴它期望一個int ,因為你使用了%d 結果是一個錯誤,結果沒有定義。

但是在int num = 5.0 + 2;情況下int num = 5.0 + 2; ,你首先得到一個double的結果, 7.0 然后強制轉換回int 該代碼相當於:

int num = (int)((double)5.0 + (double)2);

更多細節: 隱式類型促銷規則

表達式5.0 + 2的結果是double類型,因為operator +的兩個操作數中的至少一個是浮點/雙值(因此另一個將在添加之前轉換為double )。

如果你編寫printf("%d\\n", 5.0 + 2) ,你將傳遞浮點值,格式說明符實際上需要一個int 這種不匹配是未定義的行為,你收到的0可能是其他東西(另一個數字,崩潰,......什么都有)。

相反, int num = 5.0 + 2會將5.0 + 2產生的double值轉換回積分值(丟棄任何小數部分)。 所以num的值將是7並且將是 - 因為num是一個整數類型 - 然后與格式說明符%d一起有效。

5.0+2是鍵入的double

編譯器警告

int main() { return _Generic(5.0 + 2, struct foo: 0); }

應該告訴你多少

int main() { return _Generic(5.0 + 2, double: 5.0+2); }

編譯沒有錯誤沒有。

匹配"%d"printfdouble導致未定義的行為。

任何結果都是合法的,包括你的硬盤被刪除(除非你的程序已經在其中某處具有這樣的功能,否則不太可能發生;如果是,UB很可能導致它被無意中調用)。

隱式執行通常的算術轉換以將其值轉換為公共類型。 編譯器首先執行整數提升; 如果操作數仍然具有不同的類型,則它們將轉換為在以下層次結構中顯示最高的類型 -

在此輸入圖像描述

int num = 5.0 + 2; 這段代碼片段是你添加一個帶整數的浮點數並再次存回整數。 因此,c自動將結果轉換為整數以存儲在整數類型變量中。 因此,在使用%d打印時,打印效果很好。

但是,在printf("%d\\n", 5.0 + 2); 這段代碼片段,加法被轉換為浮點數,因為float優先於整數,但是你使用%d打印它。 這里格式說明符不匹配導致意外結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM