深入剖析 Java 中的运算符:i++、++i、||、|、&&、& 的奥秘
2023-10-30 18:15:19
i++ 与 ++i 的区别
i++ 和 ++i 都是 Java 中的递增运算符,它们都将变量的值增加 1。但是,它们在执行顺序上存在着细微的差别。
- i++: 先将 i 的值放在表达式中运算,然后再将 i 的值增加 1。
- ++i: 先将 i 的值增加 1,然后再将 i 的值放在表达式中运算。
举个例子,我们有以下代码:
int i = 10;
int j = i++;
int k = ++i;
执行完这段代码后,i 的值变为 12,j 的值变为 10,k 的值变为 11。这是因为 j = i++ 先将 i 的值 10 放入 j 中,然后再将 i 的值增加 1,而 k = ++i 先将 i 的值增加 1,然后再将 i 的值 11 放入 k 中。
|| 和 | 的区别
|| 和 | 都是 Java 中的逻辑或运算符,它们都返回两个操作数中的任何一个为 true 的结果。但是,它们在求值顺序上存在着差异。
- ||: 从左到右求值,如果遇到第一个为 true 的操作数,则直接返回 true,而不计算后面的操作数。
- |: 从左到右求值,无论是否遇到 true 的操作数,都会计算所有操作数。
举个例子,我们有以下代码:
boolean a = true;
boolean b = false;
boolean c = a || b;
boolean d = a | b;
执行完这段代码后,c 的值为 true,d 的值为 true。这是因为 || 从左到右求值,遇到第一个为 true 的操作数 a 后,直接返回 true,而不计算后面的操作数 b。而 | 从左到右求值,无论是否遇到 true 的操作数,都会计算所有操作数,因此 d 的值为 true。
&& 和 & 的区别
&& 和 & 都是 Java 中的逻辑与运算符,它们都返回两个操作数都为 true 的结果。但是,它们在求值顺序上存在着差异。
- &&: 从左到右求值,如果遇到第一个为 false 的操作数,则直接返回 false,而不计算后面的操作数。
- &: 从左到右求值,无论是否遇到 false 的操作数,都会计算所有操作数。
举个例子,我们有以下代码:
boolean a = true;
boolean b = false;
boolean c = a && b;
boolean d = a & b;
执行完这段代码后,c 的值为 false,d 的值为 false。这是因为 && 从左到右求值,遇到第一个为 false 的操作数 b 后,直接返回 false,而不计算后面的操作数 a。而 & 从左到右求值,无论是否遇到 false 的操作数,都会计算所有操作数,因此 d 的值为 false。
运算符优先级
Java 中的运算符具有不同的优先级,优先级高的运算符先执行,优先级低的运算符后执行。运算符优先级表如下:
优先级 | 运算符 |
---|---|
1 | () |
2 | [] |
3 | . |
4 | ++, -- |
5 | +, - |
6 | *, /, % |
7 | +, - |
8 | ==, != |
9 | <, >, <=, >= |
10 | &, ^ |
11 | |
12 | && |
13 |
运算符结合性
Java 中的运算符具有不同的结合性,结合性决定了当有多个相同优先级的运算符时,从哪个方向开始执行运算。运算符结合性表如下:
结合性 | 运算符 |
---|---|
从左到右 | (), [], ++, --, +, -, *, /, %, ==, !=, <, >, <=, >=, &, ^, |
从右到左 |
运算符重载
Java 允许对运算符进行重载,这意味着我们可以为不同的数据类型定义不同的运算符操作。例如,我们可以为自定义的 Complex 类定义 + 运算符,实现两个 Complex 对象的相加。
结语
本文详细探讨了 Java 中的运算符 i++、++i、||、|、&& 和 & 的奥秘,帮助读者深入理解这些运算符的用法和区别。同时,本文还介绍了运算符优先级和运算符结合性的概念,以及运算符重载的用法。希望本文能够帮助读者更好地掌握 Java 中的运算符。