1. 程式人生 > >java中的三元運算子沒那麼膚淺

java中的三元運算子沒那麼膚淺


最近在帶領實習生中遇到很多新手問與三元運算子有關的java題目,多數為程式碼結果題,少數為應用題。鑑於很多資料上對於java三元運算的講解過於簡單,網上的資料與題目也不是很完善,對於結果答案分析不一,故在此總結,當然僅為個人觀點,水平有限,不足之處,還請大家多多指出,互相交流學習。

  什麼是java三元運算子呢?無疑其操作元有三個,第一個是條件表示式,剩餘兩個為值,條件表示式為真時運算取第一個值,為假時取第二個值。

  其示例程式碼如下:boolean a = 20 < 45 ? true : false;三元運算子的優先順序高於賦值運算子,故判斷表示式值為真,去第一個true,a的值為true。

  三元運算子用於判斷,其等價的if-else語句如下所示:
01  boolean a; //宣告boolean變數
02  if(20<45) //將20<45作為判斷條件
03    a = true; //條件成立將true賦值給a
04  else
05    a = false;

  很多時候三元運算子可以和if-else語句進行互換,它們兩個可以等價的實現判斷的效果。但是三元運算子與if-else語句也還是有不同之處的,下面來具體的談談不同之處。

  第一,兩者之間對於返回值有不同的要求,三元運算子是必須要有返回值要求,其運算後一定會有一個結果返回供程式開發人員使用;而if-else語句並不一定有返回值,其執行結果可能是賦值語句或者列印輸出語句(相信這一點大家都比較好理解)。

  第二,兩者的效能不同,三元運算子的運算效能相對於if-else語句來說要高一些,但是在一些小型的applet開發和日常學習開發中可以忽略不計。

  第三,兩者使用範圍不同,在ireport的一些動態執行的情況下,只能用三元運算子而不能用if-else語句,當然在大多數情況下兩者是可以等價互換的。

  第四,兩者的語言特性不同,三元運算子涉及到一種成為雙目數值提升(binary numeric promotion)的語言特性。所謂的雙目數值提升,在三目運算子java開發的環境下可以簡單的理解為雙目運算子的型別轉換問題(便於理解)。其具體規則總結如下:

  1)如果定義了資料型別的變數與未定義變數的數值共同參與三元運算子的後雙目運算,,那麼返回的結果就是範圍大(精度高)型別

  2)如果兩個定義了資料型別的變數共同參與三元運算子的後雙目運算,那麼返回的結果就是範圍大(精度高)型別
  3)如果直接進行數值的比較,會自動轉型成為範圍大(精度高)的資料型別

而jvm在給數值分配資料型別的時候會選取剛好能裝下該資料大小精度的資料型別進行分配(99.0為float,99為byte/short),在java中常見資料型別其範圍從小到大(精度由高到低):byte<short<char<int<float<double。下面用一段程式碼來解釋上述的三條規則,以下測試程式碼也涵蓋了很多面試題目,希望各位可以從中理解上述三條規則。

01  char a=‘a‘;
02  int i=96;
03  //規則1,定義了資料型別的變數與未定義變數的數值,結果自動轉換為精度高的
04  System.out.println(2==2?i:9.0); 
05  //jvm給數值分配的資料型別,98並不是int型別的,而是byte/short,故結果會變為ASCII碼98

06        //對應的字元
07  System.out.println(2==2?98:a); 
08  //規則2,兩個已經定義資料型別的變數,結果自動轉換為精度高的
09  System.out.println(2==2?a:i);
10  //規則3,兩個未定義的數值,結果自動轉換為精度高的
11  System.out.println(2==2?99:9.0);
12  System.out.println(2==2?99:‘b‘);

  上述程式碼的執行結果為:  96.0
               b
               97
               99.0
               c

  大家可以參閱上述程式碼與結果理解三元運算子的雙目數值提升問題,由於本人水平有限,希望此文能給大家帶來一定的幫助和啟示,也希望各位不吝賜教,提出你們的寶貴建議。