java三元運算詳解
運算子
2.1 運算子概念
運算子是用來計算資料的指令。資料可以是常量,也可以是變數。被運算子操作的數成為運算元。
Int x = 3;
Int y = 4;
Int z = x + y
2.2 算數運算子
將運算元參與數學計算(通常為數學計算)
運算子 |
運算規則 |
範例 |
結果 |
+ |
正號 |
+3 |
3 |
+ |
加 |
2+3 |
5 |
+ |
連線字串 |
“中”+“國” |
“中國” |
- |
負號 |
int a=3;-a |
-3 |
- |
減 |
3-1 |
2 |
* |
乘 |
2*3 |
6 |
/ |
除 |
5/2 |
2 |
% |
取模(餘數) |
5%2 |
1 |
++ |
自增 |
int a=1;a++/++a |
2 |
-- |
自減 |
int b=3;a--/--a |
2 |
注意:
-
加法運算子在連線字串時要注意,只有直接與字串相加才會轉成字串。
-
除法“/”當兩邊為整數時,取整數部分,舍餘數。當兩邊為浮點型時,按正常規則相除。
-
“%”為整除取餘符號,小數取餘沒有意義。取餘結果的符號與被取餘數的符號相同。
-
得到的是兩個相除資料的餘數。
-
用處: 判斷兩個資料是否整除。
-
-
整數做被除數,0不能做除數,否則報錯。
-
小數做被除數,整除0結果為Infinity,對0取模結果為NaN
-
自增與自減
單獨使用:
前置與後置效果相同,均為直接+1或-1
混合使用:
自增(++):將變數的值加1,分字首式(如++i)和字尾式(如i++)。字首式是先加1再使用;字尾式是先使用再加1。
自減(--):將變數的值減1,分字首式(如--i)和字尾式(如i--)。字首式是先減1再使用;字尾式是先使用再減1。
自增與自減運算子還遵循以下規律:
1. 可以用於整數型別byte、short、int、long,浮點型別float、double,以及字串型別char。
2. 在Java5.0及以上版本中,它們可以用於基本型別對應的包裝器類Byte、Short、Integer、Long、Float、Double、Character。
3. 它們的運算結果的型別與被運算的變數的型別相同。
賦值運算子
為變數賦值的運算子
運算子 |
運算規則 |
範例 |
結果 |
= |
賦值 |
int a=2 |
2 |
+= |
加後賦值 |
int a=2,a+=2 |
4 |
-= |
減後賦值 |
int a=2,a-=2 |
0 |
*= |
乘後賦值 |
int a=2,a*=2 |
4 |
/= |
整除後賦值 |
int a=2,a/=2 |
1 |
%= |
取模後賦值 |
int a=2,a%=2 |
0 |
注意:
-
諸如+=這樣形式的賦值運算子,會將結果自動強轉成等號左邊的資料型別。
/*
賦值運算子:
=,+=,-=,*=,/=,%=
+=,-=,*=,/=,%=運算子的運算規則:
先將運算子兩邊進行+,-,*,/,%運算,在把結果賦值給左邊的變數
+=,-=,*=,/=,%=注意事項: 運算子左邊必須是一個變數
+=,-=,*=,/=,%=特點:隱含一個強制型別轉換
*/
public class Demo06Operator{
public static void main(String[] args){
int a = 10;
a += 20;//相當於 a = a + 20;
System.out.println("a = " + a);
//5 += 6;//錯誤: 意外的型別,這裡5的位置需要一個變數
byte b = 10;
//b = b + 100;// 錯誤: 可能損失精度
//b = (byte)(b + 100);
b += 100;//+=隱含了一個強制型別轉換 相當於b = (byte)(b + 100);
System.out.println("b = " + b);
}
}
比較運算子
-
又叫關係運算符,即判斷兩個運算元的大小關係及是否相等關係,比較運算子的返回一定為布林值。
運算子 |
運算規則 |
範例 |
結果 |
== |
相等於 |
4==3 |
false |
!= |
不等於 |
4!=3 |
true |
< |
小於 |
4<3 |
false |
> |
大於 |
4>3 |
true |
<= |
小於等於 |
4<=3 |
false |
>= |
大於等於 |
4>=3 |
true |
-
==,!=,>,<,>=,<=
-
關係運算符的結果都是boolean型,也就是要麼是true,要麼是false。
-
注意事項
-
n 關係運算符“==”不能誤寫成“=” 。
public class Demo06Operator {
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = 10;
System.out.println(a == b);
System.out.println(a == c);
System.out.println("-----------------");
System.out.println(a != b);
System.out.println(a != c);
System.out.println("-----------------");
System.out.println(a > b);
System.out.println(a > c);
System.out.println("-----------------");
System.out.println(a >= b);
System.out.println(a >= c);
System.out.println("-----------------");
int x = 3;
int y = 4;
// System.out.println(x == y);
// System.out.println(x = y);// 把y賦值給x,把x的值輸出
boolean bb = (x == y);
// 報錯
// boolean cc = (x = y);
int cc = (x = y);
}
}
邏輯運算子
用於計算兩個布林值經過指定邏輯後的運算結果,結果同樣是一個布林值
運算子 |
運算規則 |
範例 |
結果 |
& |
與(並且) |
false&true |
False |
| |
或 |
false|true |
True |
^ |
異或 |
true^flase |
True |
! |
非(取反) |
!true |
Flase |
&& |
短路與 |
false&&true |
False |
|| |
短路或 |
true ||true |
True |
-
作用:邏輯運算子用於連線布林型表示式,在Java中不可以寫成3<x<6,應該寫成x>3 && x<6 。
-
基本使用: &(與),|(或),^(異或),!(非)
-
與:& 有false則false
-
或:| 有true則true
-
異或:^ 相同則false,不同則true
-
非:! true則false,false則true
-
public class Demo08Operator {
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = 30;
System.out.println((a > b) & (a > c));// false & false
System.out.println((a < b) & (a > c)); // true & false
System.out.println((a > b) & (a < c)); // false & true
System.out.println((a < b) & (a < c)); // true & true
System.out.println("---------------");
System.out.println((a > b) | (a > c));// false | false
System.out.println((a < b) | (a > c)); // true | false
System.out.println((a > b) | (a < c)); // false | true
System.out.println((a < b) | (a < c)); // true | true
System.out.println("---------------");
System.out.println((a > b) ^ (a > c));// false ^ false
System.out.println((a < b) ^ (a > c)); // true ^ false
System.out.println((a > b) ^ (a < c)); // false ^ true
System.out.println((a < b) ^ (a < c)); // true ^ true
System.out.println("---------------");
System.out.println((a > b)); // false
System.out.println(!(a > b)); // !false
System.out.println(!!(a > b)); // !!false
}
}
-
&&和&的區別
-
單&時,左邊無論真假,右邊都進行運算;
-
雙&時,如果左邊為真,右邊參與運算,如果左邊為假,那麼右邊不參與運算。
-
“|”和“||”的區別同理,雙或時,左邊為真,右邊不參與運算。
-
三元運算子
接下來我們要學習的三元運算子與之前的運算子不同。之前學習的均為一元或者二元運算子。元即參與運算的資料。
格式:
-
(條件表示式)?表示式1:表示式2;
-
表示式:通俗的說,即通過使用運算子將運算元聯絡起來的式子,例如:
-
3+2,使用算數運算子將運算元聯絡起來,這種情況,我們稱為算數表示式。
-
3>2,使用比較運算子(也稱為條件運算子)將運算元聯絡起來,這種情況,我們稱為條件表示式。
-
其他表示式,不再一一舉例。
-
-
三元運算子運算規則:
先判斷條件表示式的值,若為true,運算結果為表示式1;若為false,運算結果為表示式2。
注意:
-
三元運算子,最終一定會產生一個結果值,這個值必須被使用起來。
-
要麼被運算子使用,要麼被列印
/*
三元運算子:求兩個數的最大值,判斷兩個數是否相等
格式:
(條件表示式) ? 表示式1 : 表示式2;
執行流程:
首先判斷條件表示式是否成立
true:表示式1作為3元運算子的結果
false:表示式2作為3元運算子的結果
注意:
三元運算子,最終一定會產生一個結果值,這個值必須被使用起來。
要麼被運算子使用,要麼被列印
*/
public class Demo10Operator{
public static void main(String[] args){
int a = 10;
int b = 20;
int max = (a > b) ? 10 : 20;
System.out.println("max = " + max);
int c = 15;
int d = 10;
//System.out.println((c != d) ? "相等" : "不相等");
String s = (c != d) ? "相等" : "不相等";
System.out.println("s = " + s);
//(c != d) ? "相等" : "不相等";//錯誤: 不是語句
//3;//錯誤: 不是語句
}
}
運算子優先順序
2.7.1 優先順序概念
運算子運算的先後順序,優先順序越高(數字越小),計算順序越靠前。
2.7.2 優先順序規則
優先順序相同的情況下,按照從左到右的順序依次運算
優先順序 |
描述 |
運算子 |
1 |
括號 |
()、[] |
2 |
正負號 |
+、- |
3 |
自增自減,非 |
++、--、! |
4 |
乘除,取餘 |
*、/、% |
5 |
加減 |
+、- |
6 |
移位運算 |
<<、>>、>>> |
7 |
大小關係 |
>、>=、<、<= |
8 |
相等關係 |
==、!= |
9 |
按位與 |
& |
10 |
按位異或 |
^ |
11 |
按位或 |
| |
12 |
邏輯與 |
&& |
13 |
邏輯或 |
|| |
14 |
條件運算 |
?: |
15 |
賦值運算 |
=、+=、-=、*=、/=、%= |
16 |
位賦值運算 |
&=、|=、<<=、>>=、 >>>= |
什麼是三元運算子呢!無疑其操作元有三個。第一個是表示式,剩餘兩個是值,條件表示式為真時,取第一個值,為假時,取第二個值。
示例程式碼如下:
package cn.三元運算;
public class Test3 {
public static void main(String[] args) {
/*第一個是表示式,剩餘兩個是值,條件表示式為真時,
取第一個值,為假時,取第二個值。 */
int a=20;
int b=45;
boolean c=20<45?true:false;
//三元運算子的優先順序高於賦值運算子,故第一個表示式為真,取第一個值,返回 a=true;
System.out.println("輸出c的結果"+"..."+c);
//三元運算子用於做判斷,其等價的if-else語句如下:
boolean c1;
if (20 < 45) {
c1 = true;
}else{
c1 = false;
}
//輸出c1的結果
System.out.println("輸出c1的結果"+"..."+c1);
}
}
三元運算子的優先順序高於賦值運算子,故第一個表示式為真,取第一個值,返回 a=true;
三元運算子用於做判斷,其等價的if-else語句如下:
boolean a;
if (20 < 45) {
a = true;
}else{
a = false;
}
簡單例項三元運算程式碼二如下:
package cn.三元運算;
public class Test {
public static void main(String[] args) {
//定義int 型別的變數a
int a=20;
//定義int 型別的變數b
int b=20;
//使用三元運算子求兩個最大值
System.out.println(a>b? a:b);
}
}
簡單例項三元運算程式碼三如下:
package cn.三元運算;
public class Test2 {
public static void main(String[] args) {
//定義int 型別a
int a=19;
//定義string 型別b
String b="";
//使用三元運算子判斷,如果a>20,b的值為大於 ,否則a<20的話,b的值為不大於
System.out.println(a>20?(b="大於"):(b="不大於"));
}
}
很多時候三元運算子可以和if-else語句進行互換,它們兩個可以等價的實現判斷的效果,但是三元運算子和if-else還是有不同之處的,下面我們來具體談談不同之處:
第一
兩者之間對於返回值有不同的要求。三元運算子是必須要有返回值的要求,其運算後一定有一個返回值返回給開發人員使用,而if-else不一定有返回值,其執行結果可能是賦值語句或者是輸出語句。
第二
兩者的效能不同。三元運算子的運算效能高於if-else。
第三
兩者使用範圍不同,在ireport的一些動態執行的情況下,只能用三元運算子而不能用if-else語句,當然在大多數情況下兩者是可以等價互換的
第四
兩者的語言特性不同,三元運算子設計到一種雙目運算子提升的特性,
所謂雙目數值提升,在雙目運算子java的開發環境下可以簡單的理解為型別轉換的問題。
1.如果定義了資料型別的變數和未定義資料型別的變數參與雙目運算子的後雙目運算,那麼返回的結果就是範圍大(精度高)的型別。
2.如果兩個定義了資料型別的變數參與雙目運算子的後雙目運算,那麼返回的結果就是範圍大(精度高)的型別。
3.如果直接進行數值的比較,則自動轉型為範圍大(精度高)的型別。