表达式是由多个操作数和运算符按照约定的规则构成的一个序列,其中运算符表示对操作数进行何种操作,而操作数可以是变量、常量或者是字面值(如:100、3.14)。例如:
int sum = a + b; int sum = 10 + 20; int avg = (a + b + c + d) / 4;
当表达式中包含多个运算符时,系统会按照运算符的优先级来控制运算符的执行顺序。例如:
x + y * z
由于 * 运算符的优先级高于 + 运算符,因此先执行 y * z 子表达式,然后再将 y * z 的结果和 x 相加。
Java 运算符优先级和结合方向如下表:
结合方向 | 运算符 | 优先级 |
从左向右 | []、()、.(方法调用) | 高 |
从右向左 | ++、--、+(单目运算符)、-(单目运算符)、~、!、new(新建对象)、(强制类型转换) | ↓ |
从左向右 | *、/、% | ↓ |
从左向右 | +(加法)、-(减法) | ↓ |
从左向右 | <<、>>、>>> | ↓ |
从左向右 | <、<=、>、>=、instanceof | ↓ |
从左向右 | ==、!= | ↓ |
从左向右 | & | ↓ |
从左向右 | ^(异或) | ↓ |
从左向右 | | | ↓ |
从左向右 | && | ↓ |
从左向右 | || | ↓ |
从右向左 | ?:(三目运算符) | ↓ |
从右向左 | =、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=、>>>= | 底 |
上表中,运算符的优先级自上而下逐行降低,同一行的运算符优先级相同。即使能够根据优先级确定运算符的执行顺序,但是还是建议使用小括号(“()”)来显示规定表达式的运算顺序,以增强代码的可读性。例如:
// 应避免这种方式,可读性差 i > 0 && i % 10 == 0 // 建议这么做 (i > 0) && ((i % 10) == 0)
表达式运算后得到的结果称为表达式的值,而表达式运算结果的数据类型也称为表达式的类型。
public class Demo { public static void main(String[] args) { int a = 10; int b = 20; int c = a + b; System.out.println("c=" + c + ", a=" + a + ", b=" + b); boolean flag = false; if(flag) { System.out.println("是"); } else { System.out.println("否"); } System.out.println(flag ? "条件1" : "条件2"); String str = "hello world"; System.out.println(str.substring(6, 8)); } }
运行示例,输出结果如下:
c=30, a=10, b=20 否 条件2 wo