未定義double卻出現他的強制型別轉換提示

時間 2021-05-29 22:56:36

1樓:大衛德劉

除號左邊float 右邊3.0被認為是doublefloat/double得到的結果是double然後你把這個double賦值給了乙個float變數,所以會提示你已經有人提到了 3.0f就可以,因為3.

0f是乙個float,float/float得到float,就沒有轉換了

2樓:開開心心學做人

講道理,你這個警告不會導致計算結果不對啊,是差0.0000x這種?這種可以不用管它,精度問題(這個展開講就蹲到我腿麻了)。

如果是上面這種問題,你可以試試print的時候,%.2f這樣控制一下它精度。(不要給我推c的了,我想答cpp的)

3樓:zkl1001

簡單說一句:根據C規則,應該是float型別做乘法或者除法操作會預設公升級為double型別進行計算,計算的結果也會變成double型別

下面是摘抄:

1. 在表示式中,char 和 short 型別的值,無論有符號還是無符號,都會自動轉換成 int 或者 unsigned int(如果 short 的大小和 int 一樣,unsigned short 的表示範圍就大於 int,在這種情況下,unsigned short 被轉換成 unsigned int)。因為它們被轉換成表示範圍更大的型別,故而把這種轉換稱為「公升級(promotion)」。

2. 按照從高到低的順序給各種資料型別分等級,依次為:long double, double, float, unsigned long long, long long, unsigned long, long, unsigned int 和 int。

這裡有乙個小小的例外,如果 long 和 int 大小相同,則 unsigned int 的等級應位於 long 之上。char 和 short 並沒有出現於這個等級列表,是因為它們應該已經被公升級成了 int 或者 unsigned int。

3. 在任何涉及兩種資料型別的操作中,它們之間等級較低的型別會被轉換成等級較高的型別。

4. 在賦值語句中,= 右邊的值在賦予 = 左邊的變數之前,首先要將右邊的值的資料型別轉換成左邊變數的型別。也就是說,左邊變數是什麼資料型別,右邊的值就要轉換成什麼資料型別的值。

這個過程可能導致右邊的值的型別公升級,也可能導致其型別降級(demotion)。所謂「降級」,是指等級較高的型別被轉換成等級較低的型別。

5. 作為引數傳遞給函式時,char 和 short 會被轉換成 int,float 會被轉換成 double。使用函式原型可以避免這種自動公升級。

為什麼 C C 語言會有未定義行為?

如果題主學過數位電路設計類課程,應該可以明白,在卡諾圖 狀態轉移表中設定UB的意義。它可以簡化閘電路的設計,同時還便於優化。程式設計上同理,使用UB可以讓編譯器不用為根本無用的狀態設計應對方式,提高效能。 MaxwellGeng 效能問題佔很大一部分。比如陣列下標,如果要加IndexOutOfRan...