参考:高效掌握 Java 中的各种操作符,包括算术操作符、关系操作符和逻辑操作符_java与操作符-CSDN博客 - 搜索 (bing.com)
操作符的优先级
1.后缀操作符:a++ a--
2.一元操作符:++a --a + - ~ !
3.乘性操作符:* / %
4.加性操作符:+ -
5.移位操作符:<< >> >>>
6.关系操作符:< > <= >=
7.相等操作符:== !=
8.位与操作符:&
9.位异或操作符:^
10.位或操作符:|
11.逻辑与操作符:&&
12.逻辑或操作符:||
13.条件操作符:? :
14.赋值操作符:= += -= *= /= %= &= ^= |= <<= >>= >>>=
算术操作符
对整数及浮点数进行算术运算(以下表格操作符优先级由高到低)
操作符 | 实际操作 | |
一元算术操作符 | - | 取反 |
++ | 自增1 | |
−− | 自减1 | |
二元算术操作符 | * | 乘法运算 |
/ | 除法运算 | |
% | 取模运算(求余) | |
+ | 加法运算 | |
− | 减法运算 |
注意增量运算:
int a=0, b=1, c=1, d=1;
b = a++; //增量操作符作后置操作符,a先赋值给b再自增,b=a=0,a=a+1=2
d = ++c; //增量操作符作前置操作符,a先自增再赋值给b,c=c+1=2,d=c=2
位操作符
位操作符直接操作整数类型的数据,按位进行运算。
操作符 | 名称 | 作用 |
& | 按位与 | 对应位都为1,结果位才为1,否则为0 |
| | 按位或 | 对应位有一个为1,结果位就为1,否则为0 |
^ | 按位异或 | 对应位不同则结果为1,相同则为0 |
~ | 按位取反 | 对应操作数每位取反 |
<< | 左移 | 操作数所有位左移指定位数,低位补0(乘2^n) |
>> | 右移 | 操作数所有位右移指定位数,高位补0,保留符号位(除2^n) |
>>> | 无符号右移 | 操作数所有位左移指定位数,高位补0 |
public class BitOperators {
public static void main(String[] args) {
int a = 5; // 0101
int b = 3; // 0011
System.out.println("a & b: " + (a & b)); // 0001 = 1
System.out.println("a | b: " + (a | b)); // 0111 = 7
System.out.println("a ^ b: " + (a ^ b)); // 0110 = 6
System.out.println("~a: " + (~a)); // 1010 = -6 (取反操作)
System.out.println("a << 1: " + (a << 1)); // 1010 = 10 (左移1位)
System.out.println("a >> 1: " + (a >> 1)); // 0010 = 2 (右移1位)
System.out.println("a >>> 1: " + (a >>> 1)); // 0010 = 2 (无符号右移1位)
}
}
关系操作符
比较整数及浮点数大小
操作符 | 名称 |
< | 小于 |
> | 大于 |
<= | 小于等于 |
>= | 大于等于 |
== | 等于 |
!= | 不等于 |
public class RelationalOperators {
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println("a < b: " + (a < b)); // true
System.out.println("a > b: " + (a > b)); // false
System.out.println("a <= b: " + (a <= b)); // true
System.out.println("a >= b: " + (a >= b)); // false
System.out.println("a == b: " + (a == b)); // false
System.out.println("a != b: " + (a != b)); // true
}
}
逻辑操作符
主要判断是否同时满足条件,或者满足至少一个条件,操作元必须是布尔表达式。
操作符 | 名称 | 作用 |
&& | 短路与(逻辑与) | 两个操作数均为true则为true,否则为false |
& | 非短路与 | 左边布尔式值为false,结果为false,JVM不再执行右边表达式;否则两边执行,再判断 |
|| | 短路或(逻辑或) | 两个操作数有一个为true则为true,否则为false |
| | 非短路或 | 左边布尔式值为true,结果为true,JVM不再执行右边表达式;否则两边执行,再判断 |
! | 逻辑非(一元操作符) | 取反操作数的布尔值 |
public class LogicalOperators {
public static void main(String[] args) {
boolean x = true;
boolean y = false;
System.out.println("x && y: " + (x && y)); // false
System.out.println("x || y: " + (x || y)); // true
System.out.println("!x: " + (!x)); // false
System.out.println("!y: " + (!y)); // true
}
}
短路与非短路操作符区别
- 对于短路操作符,如果根据操作符左边的布尔表达式就能推算出整个表达式的值,运输流程就会“短路”——不执行右边的式子。
- 对于非短路操作符,两边布尔表达式都会执行。
public class LogicalOperators1 {
public static void main(String[] args) {
int a=1, b=1, c=1, d=1;
boolean result1 = a<0 && (a+=10)>5; //a<0为false,result1结果为false,JVM不再执行(a+=10)>5
System.out.println(result1+",a="+a); //结果为false,a=1
boolean result2 = b<0 & (b+=10)>5; //两个式子都执行
System.out.println(result2+",b="+b); //结果为false,b=11
boolean result3 = c>0 || (c+=10)>5; //c>0为true,result3结果为true,JVM不再执行(c+=10)>5
System.out.println(result3+",c="+c); //结果为true,c=1
boolean result4 = d>0 | (d+=10)>5; //两个式子都执行
System.out.println(result4+",d="+d); //结果为true,d=11
}
}
三元条件操作符
根据条件返回特定值,格式如下:
布尔表达式 ?表达式1 : 表达式2
若布尔表达式值为true,则返回表达式1的值,否则返回表达式2的值。
//计算绝对值的方法
public int abs(int a){
return (a<0) ? -a : a;
}
赋值操作符
为变量赋值,使用最频繁的“=”(注意类型转换)
操作符 | 作用 |
= | 将右边操作数赋值给左边变量 |
+= | 左边变量加上右边操作数的值,并赋给左边变量 |
-= | 左边变量减去右边操作数的值,并赋给左边变量 |
*= | 左边变量乘以右边操作数的值,并赋给左边变量 |
/= | 左边变量除以右边操作数的值,并赋给左边变量 |
%= | 左边变量除余右边操作数,并赋给左边变量 |
&= | 左边变量按位与右边操作数的值,并赋给左边变量 |
|= | 左边变量按位或右边操作数的值,并赋给左边变量 |
^= | 左边变量按位异或右边操作数的值,并赋给左边变量 |
<<= | 将左边变量左移指定位数,并赋给左边变量 |
>>= | 将左边变量右移指定位数,并赋给左边变量 |
>>>= | 将左边变量无符号右移指定位数,并赋给左边变量 |