java运算符优先级
2022/5/28大约 2 分钟
| 优先级 | 运算符 | 结合性 |
|---|---|---|
| 1 | ()、[]、 . | 从左到右 |
| 2 | ! 、+(正)、 -(负)、 ~、 ++ 、— | 从右向左 |
| 3 | * 、/ 、% | 从左向右 |
| 4 | +(加) 、-(减) | 从左向右 |
| 5 | << 、>>、 >>> | 从左向右 |
| 6 | < 、<= 、> 、>= 、 instanceof | 从左向右 |
| 7 | == 、!= | 从左向右 |
| 8 | & | 从左向右 |
| 9 | ^ | 从左向右 |
| 10 | | | 从左向右 |
| 11 | && | 从左向右 |
| 12 | || | 从左向右 |
| 13 | ?: | 从右向左 |
| 14 | = 、+=、-=、*=、/=、%=、&=、|=、^=、~=、<<=、>>=、>>>= | 从右向左 |
- 优先级:优先级越小的先进行运算
- 结合性:相同优先级的多个运算符如何组合。
示例一、优先级和结合性:
int result = a + b * c + d;
// 优先级:* 大于 +、-
// 表达式等价于 a + (b * c) - d
// 再按左结合组合:(a + (b * c)) - d示例二、结合性常见误区:
boolean flag = a < b < c; // 编译错误!Java不支持链式比较
// 正确写法:boolean flag = a < b && b < c;示例三、嵌套三元运算符:
// 优化显式使用括号:
int val2 = a ? b : (c ? d : e)
// 再优化变量接收更合适
int one = (c ? d : e);
int val3 = a ? b : one;示例四、一元运算符常见误区:
int i = 5;
int a = ++i + i++;
System.out.println("I:"+i); // 7
System.out.println("a:"+a); // 12一般初学者肯能会认为a=13,应为i++和++i的优先级大于+,虽然 ++i 和 i++ 的优先级高于 +,但i++自增副作用是在返回值之后发生的,也就是先返回i。比如如下代码:
int i= 1;
int h = i++;
System.out.println("i:"+i); // 2
System.out.println("h:"+h); // 1