我發現在C語言中向int投遞的行為很奇怪(對我來說)。如果這是一個基本的問題,請原諒,但我無法找到答案,為什么下面的代碼會產生一個意外的結果。
#include <stdio.h>
int main(void)
{
printf("1000 * 0.1 = %d
", (1000 * 0.1) )。)
printf("1000 * (10/100) = %d
", (1000 * (10/100) ))。
printf("(int)1000 * 0.1 = %d
", (int)(1000 * 0.1) )。
printf("(int)1000 * (10/100) = %d
", (int)(1000 * (10/100) )。
return 0;
}
同時使用-O0和-O3的結果是一樣的:
1000 * 0.1 = 957043896。
1000 * (10/100) = 0
(int)1000 * 0.1 = 100.
(int)1000 * (10/100) = 0
我期望前兩個結果是不符合邏輯的(我不知道為什么,但我期望將一個雙倍數傳遞給int引數不應該作業)。然而,3和4之間的差異讓我感到困惑。我希望(10/100)能在編譯時計算出來,并呈現與3相同的結果。
誰能給我解釋一下為什么會出現這樣的結果,以及在這里做基于整數的除法的正確/安全方法是什么?
uj5u.com熱心網友回復:
printf("1000 * 0.1 = %d
", (1000 * 0.1) )。
//int double
int * double給出一個雙數。你試圖用"%d"來列印一個double,這是未定義行為(通常寫成UB)。嘗試printf("1000 * 0.1 = %f
", 1000 * 0.1);
printf("1000 * (10/100) = %d
", (1000 * (10/100) ))。
// int int
int / int做整數除法,沒有小數。10/100產生0(以及10的剩余部分)
printf("(int)1000 * 0.1 = %d
", (int)(1000 * 0.1) )。
//int double
雙倍數100.0被轉換為int并自然列印。注意,有可能1000 * 0.1會產生99.999999635264318,這將轉換為99
printf("(int)1000 * (10/100)= %d
", (int)(1000 * (10/100) )。
// int int
10/100是整數除法......在這種情況下是0,與上面第二條陳述句相同。
uj5u.com熱心網友回復:
例如,在這兩個printf的呼叫之間是有區別的>
printf("1000 * 0.1 = %d
", (1000 * 0.1) )。)
printf("1000 * (10/100) = %d
", (1000 * (10/100) ))。
在第一次呼叫中,運算式1000 * 0.1的型別是double,但是你使用了不正確的轉換指定符%d,它是為int型別的物件設計的。
在第二個呼叫中,運算式1000 * (10/100)確實具有int型別。請注意,將運算式轉換為int型別,如(int)(1000 * (10/100))是多余的,沒有任何意義。相反,你可以寫成例如( int )( 1000 * (10.0/100))。所以這個呼叫是正確的。然而,由于整數運算的原因,原始輸出運算式的值等于0。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/322461.html
標籤:
上一篇:我可以使用指標的位置/地址作為for回圈中的終止條件嗎?
下一篇:如何設定帶有狀態代碼的自定義例外
