前言:
Java提供了豐富的運算符,例如算術運算符、關係運算符、邏輯運算符、位運算符等;
其中又分有單目運算符和二目運算符;
一、單目運算符:只對單獨一個操作元(變量)進行操作;
-------- 其中自增、自減運算符++、--就是典型的單目運算符;
自增、自減運算符的使用特點:
1、他們在使用時可以放在操作元之前,也可以放在操作元之後,不過所蘊含的意義是不一樣的;
--- 當放在操作元之前,如 ++x ; (--x ;) 代表在使用 x 之前,先使 x 的值加 1(減1);以下代碼進行演示:
public static void main(String[] args) {
int x = 1;
++x;
System.out.println(x); //輸出x爲2
--x;
System.out.println(x); //輸出x爲1
int y = 10;
System.out.println(y); //輸出y爲10
y = ++x; //x是先進行加1操作,再將值賦給y;
System.out.println(y); //輸出y爲2
System.out.println(x); //輸出x爲2
}
--- 當放在操作元之後,如 x++ ; (x-- ;) 代表在使用 x 之後,再使 x 的值加 1(減1);以下代碼進行演示:
public static void main(String[] args) {
int x = 1;
x++;
System.out.println(x); //輸出x爲2
x--;
System.out.println(x); //輸出x爲1
int y = 10;
System.out.println(y); //輸出y爲10
y = x++; //x是先將值賦給y之後,才進行加1操作的;
System.out.println(y); //輸出y爲1
System.out.println(x); //輸出x爲2
}
2、操作元必須是一個整數類型或者浮點類型的變量,作用都是使變量的值加1或者減1;
二、二目運算符:同時對兩個操作元(變量)進行操作;
-------- 二目運算符有:
加減運算符 | +,- |
乘除運算符 | *,/ |
求餘運算符 | % |
關係運算符 | > , < , >= , <= , == , != |
賦值運算符 | = |
其中需要注意的是:邏輯運算符 && , || , !
邏輯運算符中的 && 與 || 是二目運算符 ;
邏輯運算符中的 !是單目運算符 ;
算術運算符包括:加減運算符、乘除運算符、求餘運算符 ;
加減運算符:+,- ;
1、結合計算的順序是從左到右的;例如:15+5-5 ; 是先計算15+5,在將20進行減5,最後結果爲15;
2、加減運算符的操作元是整數類型或者浮點類型的數據;
3、加減運算符的優先級爲4級;
乘除運算符:*,/ ;
1、結合計算的順序是從左到右的;例如:2*8/4 ; 是先計算2*8,在將16進行除4,最後結果爲4;
2、乘除運算符的操作元是整數類型或者浮點類型的數據;
3、乘除運算符的優先級爲3級;
求餘運算符:%;
1、結合計算的順序是從左到右的;例如:2*8%2 ; 是先計算2*8,在將16進行求餘2,最後結果爲0;
2、求餘運算符的操作元是整數類型或者浮點類型的數據;
3、求餘運算符的優先級爲3級;
算術表達式指:用算術運算符和括號連接起來的 符合Java語法規則的式子;
如:x+2*y+10+5*(z+20) ;
關係運算符: > , < , >= , <= , == , != ; (大於、小於、大於等於、小於等於、等於、不等於)
1、關係運算符的運算結果是boolean類型的,不是true,就是false,當運算符對應的關係成立時,則爲true,否則爲false;
如: 5>10 ; 關係不成立,結果爲false ; 5>1 ; 關係成立,結果爲true ;
2、關係運算符中,大小關係運算:> , < , >= , <= 的優先級爲6 ;
3、關係運算符中,相等關係運算:== , != 的優先級爲7 ;
4、結合計算的順序是從左到右的;
關係表達式指:結果爲數值型的變量(x+y)或表達式(4+5)通過關係運算符形成的關係表達式;
如 x+y>4+5 ;
賦值運算符: = ;
1、對於賦值運算符,右邊的操作元必須是變量,不能是常量或者表達式;
如:x = 10 ; y = 11 ; 正確, 不能是 10 = x ;11 = y;
2、賦值運算符的優先級爲14級;
3、結合計算的順序是從右到左的;
4、賦值運算符不能跟關係運算符中的 == 等號關係運算符混淆;如 12 = 12 ; 這是錯誤的;
邏輯運算符:&& , || , ! ; (邏輯與、邏輯或、邏輯非)
1、邏輯與 (&& )優先級爲11,當運算符左右兩邊的表達式都爲真時,整個表達式的值才爲真;
如:if( top1>0 && top2>5 ) 當 top1>0 爲真 , top2>5 爲真 時 ,則if中表達式的值才爲真;
擴展:if( top1>10 && top2<50 ) 當 top1>10 爲假時 , 則不繼續判斷 top2<50 ,默認表達式爲假 ;以下代碼進行演示:
int top1 = 1 , top2 = 2;
if(top1>10 && top2<50){
System.out.println(top1); //邏輯表達式爲真則輸出top1
}else{
System.out.println(top2); //邏輯表達式爲假則輸出top2
}
2、邏輯或 ( || )優先級爲12,對於運算符左右兩邊的表達式,當其中一邊的表達式爲真時,整個表達式的值也爲真;
如:if ( top1>10 || top2>15 ) 當 top1>10 爲假 , 則繼續對 top2>15 進行判斷 ,當top2>15爲真,則整個表達式的值爲真;
擴展:if ( top1>10 || top2>50 ) 當 top1>10 爲真時 , 則不繼續判斷 top1>50 ,默認表達式爲真 ;以下代碼進行演示:
int top1 = 100 , top2 = 20;
if(top1>10 || top2>50){
System.out.println(top1); //邏輯表達式爲真則輸出top1
}else{
System.out.println(top2); //邏輯表達式爲假則輸出top2
}
3、邏輯非( ! )優先級爲2 ,將邏輯表達式的值變成相反的值;
以下代碼進行演示:top1>10 爲真,使用邏輯非之後 !(top1>10) 則爲假,最後結果輸出 20 ;
int top1 = 100 , top2 = 20;
if( !(top1>10) ){
System.out.println(top1); //邏輯表達式爲真則輸出top1
}else{
System.out.println(top2); //邏輯表達式爲假則輸出top2
}
擴展: 不同類型之間運算時的精度問題
基本數據類型的精度從 “ 低 ” 到 “ 高 ” 排列:
byte、short、char、int、long、float、double
1、當表達式中有 double 類型的運算時,則按 double 類型進行運算;
如:5.6 / 2 +10 ,結果輸出 12.8 ;
2、當表達式中最高精度爲 float 類型的運算時,則按 float 類型進行運算;
如:6.6f / 2 +10 ,結果輸出 13.3 ;此時的 13.3 是 float 類型的;
double intd = 5.6/2 + 10 ;
System.out.println(ints); //輸出 12.8
float intf = 6.6f/2 + 10 ; //輸出 13.3
System.out.println(intf);
intf = intd ; //報錯Type mismatch: cannot convert from double to float
3、當表達式中最高精度爲 long 類型的運算時,則按 long 類型進行運算;
如 :12L+9*2 , 結果輸出 30 ;此時的 30 是 long 類型的;
4、當表達式中最高精度爲 int 類型或者低於 int 類型的運算時,則按 int 類型進行運算;
如 :20 + 15 * 2 ,結果輸出 50 ;此時的 50 是 int 類型的;
int intt = (byte) 10 + 'a' ; 結果輸出 107 ;此時的 107 是 int 類型的;
特別注意:Java中不能把超過 byte 、short 、char 的取值範圍的算術表達式的值賦給 byte 、short 、char 類型的變量;
如:byte intb = 20 + 'a' ; 結果輸出 117 ;此時的 117是int類型的常量 ;
因爲117沒有超過byte的取值範圍,所以程序編譯通過;
當:byte intbb = 40 + 'a' ; // 報錯:Type mismatch: cannot convert from int to byte
因爲此時 40 + 'a' 輸出結果爲 137 ,已經超過了byte的取值範圍,所以程序報錯;
需要詳細瞭解爲什麼int類型常量可以直接賦予byte類型變量可以訪問下面鏈接: