java表示式中型別的自動提升(轉)
java表示式中型別的自動提升(轉)[@more@]除了賦值,還有另外一種型別變換:在表示式中。想要知道原因,往下看。在表示式中,對中間值的精確要求有時超過任何一個運算元的範圍。例如,考慮下面的表示式: byte a = 40; byte b = 50; byte c = 100; int d = a * b / c; 中間項結果a*b 很容易超過它的任何一個byte 型運算元的範圍。為處理這種問題,當分析表示式時,Java 自動提升各個byte 型或short型的運算元到int 型。這意味著子表示式a*b 使用整數而不是位元組型來執行。這樣,儘管變數a和b都被指定為byte 型,50*40 中間表示式的結果2000 是合法的。自動型別提升有好處,但它也會引起令人疑惑的編譯錯誤。例如,這個看起來正確的程式卻會引起問題: byte b = 50; b = b * 2; // Error! Cannot assign an int to a byte! 該程式試圖將一個完全合法的byte 型的值50*2 再儲存給一個byte 型的變數。但是當表示式求值的時候,運算元被自動地提升為int 型,計算結果也被提升為int 型。這樣,表示式的結果現在是int 型,不強制轉換它就不能被賦為byte 型。確實如此,在這個特別的情況下,被賦的值將仍然適合目標型別。在你理解溢位的後果的情況下,你應該使用一個顯式的強制型別轉換,例如: byte b = 50; b = (byte)(b * 2); 它產生出正確的值100 。 3.10.1 型別提升的約定除了將byte 型和shorts 型提升到int 型以外,Java 定義了若干適用於表示式的型別提升規則(type promotion rules )。首先,如剛才描述的,所有的byte 型和short型的值被提升到 int 型。其次,如果一個運算元是long 型,整個表示式將被提升到long 型;如果一個運算元是float 型,整個表示式將被提升到float 型;如果有一個運算元是double 型,計算結果就是double 型。下面的程式表明:在表示式中的每個值是如何被提升以匹配各自二進位制運算子的第二個引數: class Promote { public static void main(String args[]) { byte b = 42; char c = 'a'; short s = 1024; int i = 50000; float f = 5.67f; double d = .1234; double result = (f * b) + (i / c) - (d * s); System.out.println((f * b) + " + " + (i / c) + " - " + (d * s)); System.out.println("result = " + result);}} 讓我們進一步看看發生在下列程式行的型別提升: double result = (f * b) + (i / c) - (d * s); 在第一個子表示式f*b 中,變數b被提升為float 型別,該子表示式的結果當然是float 型別。接下來,在子表示式i/c,中,變數c被提升為int 型別,該子表示式的結果當然是int 型別。然後,子表示式d*s 中的變數s被提升為double 型別,該子表示式的結果當然也是double 型別。最後,考慮三個中間值,float 型別,int 型別,和double 型別。float 型別加int 型別的結果是float 型別。然後float 型別減去提升為double 型別的double 型別,該表示式的最後結果是double 型別。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-958140/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [轉]Java 8 的 lambda 表示式 Java 8 的 lambda 表示式Java
- Java中型別判斷的幾種方式Java型別
- 自動提升為int型別型別
- Java資料型別自動轉換(++ ,+=)Java資料型別
- C++ 表示式中的型別轉換C++型別
- java基本資料型別與自動轉換Java資料型別
- Java的Lambda表示式Java
- java和js中正規表示式的用法和區別JavaJS
- 在JAVA中使用正規表示式 (轉)Java
- Java中的型別提升Java型別
- Java 中的 Lambda 表示式Java
- [JAVA] Java 變數、表示式和資料型別詳解Java變數資料型別
- Java | Lambda表示式Java
- Lambda表示式(Java)Java
- java lambda 表示式Java
- Java Lambda表示式Java
- 表示式計算原始碼JAVA實現 (轉)原始碼Java
- 中綴表示式轉為逆波蘭表示式
- 函式宣告和函式表示式的區別函式
- Excel函式應用例項:自動錄入性別(轉)Excel函式
- java中的正規表示式Java
- Java8的Lambda表示式Java
- Java中Lambda表示式的使用Java
- Java 8 中的 lambda 表示式Java
- Java中正規表示式的使用Java
- Java之lambda表示式Java
- Java 8 Lambda 表示式Java
- java正規表示式Java
- java 8 lambda表示式Java
- Java Lambda 表示式初探Java
- 【java】正規表示式Java
- 正規表示式(java)Java
- Java資料型別的顯式轉換和隱式轉換Java資料型別
- 如何利用 C++ 的 Lambda 表示式提升 Qt 程式碼C++QT
- Guru of the week:#19 自動型別轉換. (轉)型別
- 用正規表示式自動下載網頁中的圖片網頁
- 1.自執行函式表示式函式
- java中Lamdba表示式的用法整理Java