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

轉自:http://www.mamicode.com/info-detail-1010428.html 
最近在帶領實習生中遇到很多新手問與三元運算符有關的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

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

本文出自 “白日夢藍” 博客,請務必保留此出處http://itmlt1029.blog.51cto.com/10658744/1689127

發佈了50 篇原創文章 · 獲贊 424 · 訪問量 40萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章