日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java三目运算符判断boonlean,java三元运算符

發(fā)布時間:2025/3/19 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java三目运算符判断boonlean,java三元运算符 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

首先看一下三元運算符的格式

[條件語句] ? [表達式1] : [表達式2]

其中如條件語句為真執(zhí)行表達式1,否則執(zhí)行表達式2.簡單的例子就不舉了,來點其它的。在JDK1.5以前的版本中,表達式1和表達式2都要求是相同的類型,比如都是String或者char之類的,在JDK1.5以后,有了自動拆箱和裝箱的原因,兩者只要其中一種或者兩者都能被拆箱即可,比如表達式1為Integer,而表達式2為int類型的,比如如下

1

int

a = 1;

2

Integer b = 2;

3

boolean

c = ture;

4

int

d = c ? b : a;

還有個需要注意的是,如果表達式1和表達式2的類型不相同,那么他們需要對交集類型的自動參考轉(zhuǎn)換

。例如如下這段代碼

1

String str = "abc";

2

StringBuilder strbu = new

StringBuilder("def");

3

boolean

boo = true

;

4

CharSequence cs = boo ? str : strbu;

因為String和StringBuilder都實現(xiàn)了CharSequence這個接口。

確定條件表達式結(jié)果類型的規(guī)則的核心是以下3點:

1 如果表達式1和表達式2操作數(shù)具有相同的類型,那么它就是條件表達式的類型。

2 如果一個表達式的類型是byte、short、char類型的,而另外一個是int類型的常量表達式,且它的值可以用類型byte、short、char三者之一表示的,那么條件表達式的類型就是三者之一

3 否則,將對操作數(shù)類型進行二進制數(shù)字提升,而條件表達式的類型就是第二個和第三個操作數(shù)被提升之后的類型

以上的三點可以用如下的代碼來幫助理解:

1

char

ch = 'a';

2

int

num = 0 ;

3

boolean

bool = true

;

4

System.out.print( bool ? ch : 0);  //這里不是 bool ? ch : num ,那樣會打印兩個97

5

System.out.print( !bool ? num : ch);

這段代碼打印的是 a97 。很顯然,第二點的規(guī)則應(yīng)用到第一個打印上了,返回的是char,第三點的規(guī)則應(yīng)用到第二個打印上了,返回的是int 。但是誰會在乎這個順序?qū)е碌拇蛴〗Y(jié)果,所以為了避免不必要的麻煩,很顯然顯式強制類型轉(zhuǎn)換

是個很不錯的選擇 -_-

1

char

ch = 'a';

2

int

num = 0 ;

3

boolean

bool = true

;

4

System.out.print( bool ? (char

)ch : (char

)0);

5

System.out.print( !bool ? (int

)num : (int

)ch);

還有值得注意的是 表達式1 和 表達式2 不一定非得是數(shù)據(jù)類型,還可以是自己定義的方法,只要方法有返回值

就行。例如

復(fù)制代碼

1

static

int

test1(int

i) {

2

i += 1;

3

return

i;

4

5

}

6

7

static

int

test2(int

i) {

8

i += 2;

9

return

i;

10

}

11

12

public

static

void

ternary() {

13

boolean

boo = false

;

14

int

c = boo ? test1(1) : test2(2);

15

}

復(fù)制代碼

以上就是個人的一點小心得~~有些內(nèi)容可以參考[條件表達式規(guī)范[JLS 15.25]

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

其示例代碼如下:boolean a = 20 < 45 ? true : false;三元運算符的優(yōu)先級高于賦值運算符,故判斷表達式值為真,去第一個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語句進行互換,它們兩個可以等價的實現(xiàn)判斷的效果。但是三元運算符與if-else語句也還是有不同之處的,下面來具體的談?wù)劜煌帯?/p>

第一,兩者之間對于返回值有不同的要求,三元運算符是必須要有返回值要求,其運算后一定會有一個結(jié)果返回供程序開發(fā)人員使用;而if-else語句并不一定有返回值,其執(zhí)行結(jié)果可能是賦值語句或者打印輸出語句(相信這一點大家都比較好理解)。

第二,兩者的性能不同,三元運算符的運算性能相對于if-else語句來說要高一些,但是在一些小型的applet開發(fā)和日常學(xué)習(xí)開發(fā)中可以忽略不計。

第三,兩者使用范圍不同,在ireport的一些動態(tài)執(zhí)行的情況下,只能用三元運算符而不能用if-else語句,當然在大多數(shù)情況下兩者是可以等價互換的。

第四,兩者的語言特性不同,三元運算符涉及到一種成為雙目數(shù)值提升(binary numeric promotion)的語言特性。所謂的雙目數(shù)值提升,在三目運算符java開發(fā)的環(huán)境下可以簡單的理解為雙目運算符的類型轉(zhuǎn)換問題(便于理解)。其具體規(guī)則總結(jié)如下:

1)如果定義了數(shù)據(jù)類型的變量與未定義變量的數(shù)值共同參與三元運算符的后雙目運算,,那么返回的結(jié)果就是范圍大(精度高)類型

2)如果兩個定義了數(shù)據(jù)類型的變量共同參與三元運算符的后雙目運算,那么返回的結(jié)果就是范圍大(精度高)類型

3)如果直接進行數(shù)值的比較,會自動轉(zhuǎn)型成為范圍大(精度高)的數(shù)據(jù)類型

而jvm在給數(shù)值分配數(shù)據(jù)類型的時候會選取剛好能裝下該數(shù)據(jù)大小精度的數(shù)據(jù)類型進行分配(99.0為float,99為byte/short),在java中常見數(shù)據(jù)類型其范圍從小到大(精度由高到低):byte

01  char a='a';

02  int i=96;

03  //規(guī)則1,定義了數(shù)據(jù)類型的變量與未定義變量的數(shù)值,結(jié)果自動轉(zhuǎn)換為精度高的

04  System.out.println(2==2?i:9.0);

05  //jvm給數(shù)值分配的數(shù)據(jù)類型,98并不是int類型的,而是byte/short,故結(jié)果會變?yōu)锳SCII碼98對應(yīng)的字符

06  System.out.println(2==2?98:a);

07  //規(guī)則2,兩個已經(jīng)定義數(shù)據(jù)類型的變量,結(jié)果自動轉(zhuǎn)換為精度高的

08  System.out.println(2==2?a:i);

09  //規(guī)則3,兩個未定義的數(shù)值,結(jié)果自動轉(zhuǎn)換為精度高的

10  System.out.println(2==2?99:9.0);

11  System.out.println(2==2?99:'b');

上述代碼的執(zhí)行結(jié)果為:  96.0

b

97

99.0

c

以前一直在C#中使用,得到的結(jié)果一直是如果兩個數(shù)據(jù)類型不同,則會進行向上轉(zhuǎn)型,如char-->int

Csharp代碼

char x = 'X';

int i = 0;

System.Console.Write(true ? x : 0);

System.Console.Write(false ? i : x);

運行這段代碼,會得到的結(jié)果是:8888.如上面的解釋一樣。(備注:如果x和i之間沒有直接的類型轉(zhuǎn)換,則無法編譯通過)

但是,在java中執(zhí)行,卻是不同的結(jié)果。

Java代碼

char x = 'X';

int i = 0;

System.out.println(true ? x : 0);

System.out.println(false ? i : x);

運行這段結(jié)果,得到的卻是:X88,可以看到三元運算符的結(jié)果,與第二個表達式的類型有直接的關(guān)系。

對于第一個表達式:true ? x :0 因為x的類型為char,當表達式為真的時候,結(jié)果類型為char,得到的結(jié)果是X。

對于第二個表達式:false ? i : x,因為i的類型為整型,當表達式為false的時候,結(jié)果類型為int,于是char向上轉(zhuǎn)型為整型,輸出88。

結(jié)論:

1、在不同的開發(fā)語言中,一定要注意相同的語句,可能會存在不同的結(jié)果。

2、盡量避免在條件運算符兩側(cè),使用不同的數(shù)據(jù)類型。

大家可以參閱上述代碼與結(jié)果理解三元運算符的雙目數(shù)值提升問題,由于本人水平有限,希望此文能給大家?guī)硪欢ǖ膸椭蛦⑹?#xff0c;也希望各位不吝賜教,提出你們的寶貴建議。

總結(jié)

以上是生活随笔為你收集整理的java三目运算符判断boonlean,java三元运算符的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。