3.7.8 运算符的结合性和优先级
3.7.8 运算符的结合性和优先级
所有的数学运算都认为是从左向右运算的,Java语言中大部分运算符也是从左向右结合的,只有单目运算符、赋值运算符和三目运算符例外,其中,单目运算符、赋值运算符和三目运算符是从右向左结合的,也就是从右向左运算。
乘法和加法是两个可结合的运算,也就是说,这两个运算符左右两边的操作数可以互换位置而不会影响结果。
运算符有不同的优先级,所谓优先级就是在表达式运算中的运算顺序。表3.4列出了包括分隔符在内的所有运算符的优先级顺序,上一行中的运算符总是优先于下一行的。
| 运算符说明 | Java运算符 |
|---|---|
| 分隔符 | . [] () {} , ; |
| 单目运算符 | ++ -- ~ ! |
| 强制类型转换运算符 | (type) |
| 乘法除法/求余 | * / % |
| 加法/减法 | + - |
| 移位运算符 | << >> >>> |
| 关系运算符 | < <= > >= instanceof |
| 等价运算符 | == != |
| 按位与 | & |
| 按位异或 | ^ |
| 按位或 | ` |
| 条件与 | && |
| 条件或 | ` |
| 三目运算符 | ? : |
| 赋值 | = += -= *= /= &= ` |
根据表3.4中运算符的优先级,下面分析一下int a=3;int b=a+2*a;语句的执行过程。程序先执行2*a得到6,再执行a+6得到9。
如果使用()就可以改变程序的执行顺序,例如int b=(a+2)*a,则先执行a+2得到结果5,再执行5*a得到15
因为Java运算符存在这种优先级的关系,因此经常看到有些学生在做SCJP,或者某些公司的面试题,有如下Java代码:
1 | int a=5; |
的值是多少?这样的语句实在太恐怖了,即使多年的老程序员看到这样的语句也会眩晕。
这样的代码只能在考试中出现,源代码就是一份文档,源代码的可读性比代码运行效率更重要。因此在这里要提醒读者
- 不要把一个表达式写得过于复杂,如果一个表达式过于复杂,则把它分成几步来完成
- 不要过多地依赖运算符的优先级来控制表达式的执行顺序,这样可读性太差,尽量使用
()来控制表达式的执行顺序。