文章目錄
- 一、算數運算子
- 1.基本四則運算子
- 2.增量賦值運算子
- 3.自增/自減運算子 ++ --
- 二、關系運算子
- 布爾運算式
- 三、 邏輯運算子
- 邏輯與(短路與) &&
- 邏輯或(短路或) ||
- 邏輯非 !
- 短路求值
- &和 | (不推薦使用)
- 四、位運算子
- 按位與 &
- 按位或 |:
- 按位取反 ~
- 按位異或 ^
- 五、移位運算
- 無符號右移 >>>
- 六、條件運算子(三目運算子)
- 七、運算子的優先級
- 總結
一、算數運算子
1.基本四則運算子
基本四則運算子 包括 + - * / %
加減乘都比較簡單,主要注意的就是除法和取余數
除法 :int/int還是一個整形,不可能是小數,如果想算出小數,怎除數或者被除數里必須要有一個是小數,
注意:0不能作為除數!
public class Swap {
public static void main(String[] args) {
System.out.println("1/2="+1/2);
System.out.println("1/2.0="+1/2.0);
System.out.println("1.0/2="+1.0/2);
}
}

取余:%也就是取余數,在C語言中取余只能用于整形,在java中取余不僅能用于整形還能用于浮點型
public class Swap {
public static void main(String[] args) {
float a = 2.5f;
int b = 2;
int c = 3;
System.out.println("a%b="+a%b);
System.out.println("c%b="+c%b);
}
}

2.增量賦值運算子
+= -= *= /= %=
這個也沒什么太多要講的,就是有一個要注意小細節,來看一個例子,
public class Swap {
public static void main(String[] args) {
int a = 1;
a = a+2;
short b = 1;
b = b+2;
b+=2;
System.out.println(b);
}
}

為什么 b+=2 不報錯而 b=b+2 就報錯呢?我們知道b是short型別,2是一個整形所以不能賦值,但為什么把b+=2;就可以呢?其實 += -= *= /= %=這些復合運算子在計算的時候會進行一次強制型別轉換,
b+=2 相當于 b = (short)(b+2)
3.自增/自減運算子 ++ –
這里就分為前置++ – 和后置++ --,一個是先加再用一個是先用后加的區別
public class Swap {
public static void main(String[] args) {
int a = 1;
int b = 2;
a = a++;
b = ++b;
System.out.println(a);
System.out.println(b);
}
}

還有就是前置++ --在使用時不取回傳值,前置和后置效果是一樣的,比如
public class Swap {
public static void main(String[] args) {
int a = 1;
int b = 1;
a++;
++b;
System.out.println("a="+a);
System.out.println("b="+b);
}
}

總結:
1.如果不取自增運算的運算式的回傳值, 則前置自增和后置自增沒有區別.
2. 如果取運算式的回傳值, 則前置自增的回傳值是自增之后的值, 后置自增的回傳值是自增之前的值
二、關系運算子
布爾運算式
== < > != <= >= 這些都是布爾運算式
而這些運算式的回傳值都是:false和true
true :真
false:假
關系運算子主要有六個:
== != < > <= >=
public class Swap {
public static void main(String[] args) {
int a = 10;
int b = 30;
System.out.println(a == b);
System.out.println(a != b);
System.out.println(a < b);
System.out.println(a > b);
System.out.println(a <= b);
System.out.println(a >= b);
}
}

注意: 關系運算子的運算式回傳值都是布爾型別( boolean);
三、 邏輯運算子
邏輯運算子主要有三個: && || !
注意: 邏輯運算子的運算元(運算元往往是關系運算子的結果)和回傳值都是 boolean
邏輯與(短路與) &&
規則: 兩個運算元都為 true, 結果為 true, 否則結果為 false
注意:&&左右兩邊都必須是布爾運算式,且如果前面的運算式為假后面的運算式就不會執行了
public class Swap {
public static void main(String[] args) {
int a = 0;
int b = 5;
int c = 10;
System.out.println(a < b && b < c);
}
}
邏輯或(短路或) ||
規則: 兩個運算元都為 false, 結果為 false, 否則結果為 true
注意:||左右兩邊都必須是布爾運算式,且如果前面的運算式為真后面的運算式就不會執行了
public class Swap {
public static void main(String[] args) {
int a = 0;
int b = 5;
int c = 10;
System.out.println(a < b || b < c);
}
}
邏輯非 !
規則: 運算元為 true, 結果為 false; 運算元為 false, 結果為 true(這是個單目運算子, 只有一個運算元)
同樣!后面一定要跟布爾運算式
public class Swap {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(!(a<b));
}
}
代碼如下(示例):
短路求值
&& 和 || 遵守短路求值的規則
public class Swap {
public static void main(String[] args) {
System.out.println(10 > 20 && 10 / 0 == 0); // 列印 false
System.out.println(10 < 20 || 10 / 0 == 0); // 列印 true
}
}
我們都知道, 計算 10 / 0 會導致程式拋出例外. 但是上面的代碼卻能正常運行, 說明 10 / 0 并沒有真正被求值.
結論:
- 對于 && , 如果左側運算式值為 false, 則運算式的整體的值一定是 false, 無需計算右側運算式.
- 對于 ||, 如果左側運算式值為 true, 則運算式的整體的值一定是 true, 無需計算右側運算式.
&和 | (不推薦使用)
& 和 | 如果運算元為 boolean 的時候, 也表示邏輯運算. 但是和 && 以及 || 相比, 它們不支持短路求值,
public class Swap {
public static void main(String[] args) {
System.out.println(10 > 20 & 10 / 0 == 0); // 程式拋出例外
System.out.println(10 < 20 | 10 / 0 == 0);
}
}
因為&和|無論前面真偽,都會繼續向后判斷
四、位運算子
Java 中對資料的操作的最小單位不是位元組, 而是二進制位.
位運算子主要有四個:
& | ~ ^
位操作表示 按二進制位運算. 計算機中都是使用二進制來表示資料的(01構成的序列), 按位運算就是在按照二進制位的
每一位依次進行計算.
按位與 &
如果兩個二進制位都是 1, 則結果為 1, 否則結果為 0
按位或 |:
如果兩個二進制位都是 0, 則結果為 0, 否則結果為 1.
public class Swap {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(a & b);
System.out.println(a | b);
}
}
注意: 當 & 和 | 的運算元為整數(int, short, long, byte) 的時候, 表示按位運算, 當運算元為 boolean 的時候, 表示邏輯
運算.
按位取反 ~
如果該位為 0 則轉為 1, 如果該位為 1 則轉為 0
按位異或 ^
如果兩個數字的二進制位相同, 則結果為 0, 相異則結果為 1
五、移位運算
移位運算子有三個:
<< >> >>>
都是按照二進制位來運算
左移 <<: 最左側位不要了, 最右側補 0
右移 >>: 最右側位不要了, 最左側補符號位(正數補0, 負數補1)
public class Swap {
public static void main(String[] args) {
int a = 16;
int b = 1;
System.out.println(a>>1);//右移
System.out.println(a>>2);
System.out.println(a>>3);
System.out.println(b<<1);//左移
System.out.println(b<<2);
System.out.println(b<<3);
}
}

可以看出來左移1位相當于乘以了2,同樣右移就是除以了2.
無符號右移 >>>
最右側位不要了, 最左側統一補0.(而右移動則是補符號位)
public class Swap {
public static void main(String[] args) {
int a = -1;
System.out.println(a>>1);
System.out.println(a>>>1);
}
}

注意:
- 左移 1 位, 相當于原數字 * 2. 左移 N 位, 相當于原數字 * 2 的N次方.
- 右移 1 位, 相當于原數字 / 2. 右移 N 位, 相當于原數字 / 2 的N次方.
- 由于計算機計算移位效率高于計算乘除, 當某個代碼正好乘除 2 的N次方的時候可以用移位運算代替.
- 移動負數位或者移位位數過大都沒有意義
六、條件運算子(三目運算子)
運算式1 ? 運算式2 : 運算式3
當 運算式1 的值為 true 時, 整個運算式的值為 運算式2 的值; 當 運算式1 的值為 false 時, 整個運算式的值為 運算式3 的值.
利用條件運算子求最大值
public class Swap {
public static void main(String[] args) {
int a = 10;
int b = 20;
int max = a > b ? a : b;
System.out.println(max);
}
}
七、運算子的優先級
運算子之間是有優先級的. 具體的規則我們不必記憶. 在可能存在歧義的代碼中加上括號即可
public class Swap {
public static void main(String[] args) {
System.out.println(3*4+1);
System.out.println(3*(4+1));
}
}
總結
1. % 操作在 Java 中也能針對 double 來計算.
2. 需要區分清楚 前置自增 和 后置自增之間的區別.
3. 由于 Java 是強型別語言, 因此對于型別檢查較嚴格, 因此像 && 之類的運算運算元必須是 boolean.
4. 要區分清楚 & 和 | 什么時候是表示按位運算, 什么時候表示邏輯運算.
整體來看, Java 的運算子的基本規則和 C 語言基本一致
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/272228.html
標籤:java
上一篇:初學java多型
下一篇:java基本資料型別與運算子
