[英]C language : why when input a float number in an int declared variable the result varries
[英]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
打印float
或double
值,您應使用格式"%f"
。
同
int num = 5.0 + 2;
您將5.0 + 2
的結果轉換為int
值7
。 然后使用正確的格式說明符打印int
值。
在所有表達式中,每個操作數都有一個類型。 5.0
有double
類型。 2
有int
類型。
只要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"
與printf
的double
導致未定義的行為。
任何結果都是合法的,包括你的硬盤被刪除(除非你的程序已經在其中某處具有這樣的功能,否則不太可能發生;如果是,UB很可能導致它被無意中調用)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.