Java中 a a b 和 a b 的區別

2021-09-19 20:36:40 字數 1262 閱讀 9787

千萬不要放過任何乙個小的知識點(乙個這麼小的點也可以拿來寫一篇文章 哈?)

首先網傳 a+=b 的效率會比 a=a+b 的效率要高一點,但是我驗證了一下,好像並沒有這回事。執行 1000000000 次 a=a+1的時間和 a+=1的時間幾乎差不多,而且有時候前者快,有時候後者快。這裡就不討論效率高低這個區別了。

說一下另外乙個很顯著的區別: += 這個運算中包含了強制轉換的操作。所以當我們把兩個不同型別的變數使用 += 操作的時候,其實編譯器已經自動幫我們強制轉型了。而 =+ 並沒有自動轉型,所以如果我們沒有手動強制轉型的話,編譯的時候是會報錯的。

看一下測試**:

public

class

plusequal

}

現在我們編譯的話,是會報錯的:

錯誤: 不相容的型別: 從int轉換到char可能會有損失

a = a + b;

因為此時a+b此時得到的結果是int,不能直接賦給 char 型的 a。需要強制轉型成 a = (char)(a + b);

要記住兩點:

一、運算過程中,低精度的型別向高精度型別轉換。

二、如果將高精度的數值賦值給低精度型別變數,則必須要進行顯性的強制轉換。

你猜system.out.println(0.1 * 3);列印出來的結果是什麼?對,是0.30000000000000004。這就是我們要討論的小數浮點數的精度問題,而整數浮點數沒有精度這個問題。為啥子呢?

先說整數為啥沒有這個問題,其實不管是小數還是整數,計算機都是使用二進位制儲存的。例如 3 用二進位制可以表示為 11。因為 2^0 = 1, 2^1 = 2,就這兩,我乙個乙個往上懟,就可以表示一切整數了,對吧,我就不證明了啊哈哈(不會)。

但是小數呢? 2^-1 = 0.5 , 2^-2 = 0.25。由於 double 的長度是64位,其中符號位s佔1位,階碼e佔11位,尾數m佔52位。最終浮點數可以表達為:(-1)^s * m * 2(e)。這樣能精確表達的出來的小數其實是有限的,比如 0.25可以直接表達成:(-1)^0 * 1.000000000000 * 2^(-2)。但是0.3這種小數呢?很顯然是無法精確表達的,只能通過近似表達,精確到小數點後的16位。

這樣也引申出了乙個題目喲:3 * 0.1 == 0.3將會返回什麼?true 還是 false?

the end.

a a b和a b的區別

本文的測試環境是vs2008,測試語言是c 以前我一直認為a a b a b沒有什麼區別,網上的一些人也認為這兩句沒有什麼很大的區別。但是今天在用c 中checked關鍵字檢查溢位的程式中發現用前者編譯不能通過,後者可以,帶著這個疑問,我又查了一些資料,終於有了乙個合理的解釋,如果有錯誤,希望大神指...

a a b和a b的區別

首先,高興啊高興,因為今天問小葉這個問題,他說沒有區別,哈哈,但是呢,我還是查到了區別,吼吼 因為,是他疏忽了。哦哦 其次,謝謝武讓的講解。下面進入正題 1 對於同樣型別的a,b來說 兩個式子執行的結果確實沒有什麼區別。但是從編譯的角度看吧 武讓說的 a b 執行的時候效率高。2 對於不同型別的a,...

a a b 與 a b 的區別

1 對於同樣型別的a,b來說 兩個式子執行的結果確實沒有什麼區別。但是從編譯的角度看吧 武讓說的 a b 執行的時候效率高。2 對於不同型別的a,b來說 2.1 不同型別的兩個變數在進行運算的時候,我們經常說到的是型別的轉換問題。這裡,記住兩點 一 運算過程中,低精度的型別向高精度型別轉換。二 如果...