Java运算符与控制流详解
立即解锁
发布时间: 2025-08-17 02:35:31 阅读量: 15 订阅数: 22 


Java编程基础与SCJP认证指南
# Java 运算符与控制流详解
## 1. 布尔逻辑复合赋值运算符
布尔逻辑复合赋值运算符包括 `&=`、`^=` 和 `|=`。以下是示例代码:
```java
boolean b1 = false, b2 = false, b3 = false;
Boolean b4 = false;
b1 |= true;
// true
b4 ^= b1; // (1) true, unboxing in (b4 ^ b1), boxing on assignment
b3 &= b1 | b2;
// (2) false. b3 = (b3 & (b1 | b2)).
b3 = b3 & b1 | b2;
// (3) true. b3 = ((b3 & b1) | b2).
```
在赋值操作 (1) 中,需要先拆箱以计算右侧表达式,然后装箱以赋值布尔结果。比较赋值操作 (2) 和 (3) 可以发现,操作数相同但结果不同,这体现了运算符优先级对计算的影响。
布尔逻辑复合赋值运算符的表达式及计算方式如下表所示:
| 表达式 | 计算方式 |
| ---- | ---- |
| `b &= a` | `b = (b & (a))` |
| `b ^= a` | `b = (b ^ (a))` |
| `b |= a` | `b = (b | (a))` |
## 2. 条件运算符:`&&` 和 `||`
条件运算符 `&&` 和 `||` 与逻辑运算符 `&` 和 `|` 类似,但它们具有短路特性。条件运算符只能应用于布尔操作数,计算结果为布尔值。其定义如下表:
| 运算符 | 描述 |
| ---- | ---- |
| `x && y` | 当两个操作数都为 `true` 时,结果为 `true`;否则为 `false`。 |
| `x || y` | 当任一或两个操作数为 `true` 时,结果为 `true`;否则为 `false`。 |
条件运算符的真值表如下:
| x | y | x && y | x || y |
| ---- | ---- | ---- | ---- |
| true | true | true | true |
| true | false | false | true |
| false | true | false | true |
| false | false | false | false |
### 2.1 短路求值
在涉及条件与 (`&&`) 和条件或 (`||`) 的布尔表达式求值中,先计算左操作数,若结果可由左操作数确定,则不计算右操作数。例如:
```java
Boolean b1 = 4 == 2 && 1 < 4; // false, short-circuit evaluated as
// (b1 = ((4 == 2) && (1 < 4)))
boolean b2 = !b1 || 2.5 > 8;
// true, short-circuit evaluated as
// (b2 = ((!b1) || (2.5 > 8)))
Boolean b3 = !(b1 && b2); // true
boolean b4 = b1 || !b3 && b2; // false, short-circuit evaluated as
// (b4 = (b1 || ((!b3) && b2)))
```
以计算布尔变量 `b4` 的值为例,其求值顺序如下:
```plaintext
(b4 = (b1 || ((!b3) && b2)))
-> (b4 = (false || ((!b3) && b2)))
-> (b4 = (false || ((!true) && b2)))
-> (b4 = (false || ((false) && b2)))
-> (b4 = (false || false))
-> (b4 = false)
```
可以看到,`b2` 未被求值,体现了短路特性。
### 2.2 短路求值示例代码
```java
public class ShortCircuit {
public static void main(String[] args) {
// Boolean b1 = 4 == 2 && 1 < 4;
Boolean b1 = operandEval(1, 4 == 2) && operandEval(2, 1 < 4);
System.out.println();
System.out.println("Value of b1: " + b1);
// boolean b2 = !b1 || 2.5 > 8;
boolean b2 = !operandEval(1, b1) || operandEval(2, 2.5 > 8);
System.out.println();
System.out.println("Value of b2: " + b2);
// Boolean b3 = !(b1 && b2);
Boolean b3 = !(operandEval(1, b1) && operandEval(2, b2));
System.out.println();
System.out.println("Value of b3: " + b3);
// boolean b4 = b1 || !b3 && b2;
boolean b4 = operandEval(1, b1) || !operandEval(2, b3) && operandEval(3, b2);
System.out.println();
System.out.println("Value of b4: " + b4);
// boolean b5 = b1 | !b3 & b2; // Using boolean logical operators
boolean b5 = operandEval(1, b1) | !operandEval(2, b3) & operandEval(3, b2);
System.out.println();
System.out.println("Value of b5: " + b5);
}
static boolean operandEval(int opNum, boolean operand) { // (1)
System.out.print(opNum);
return operand;
}
}
```
程序输出如下:
```plaintext
1
Value of b1: false
1
Value of b2: true
1
Value of b3: true
12
Value of b4: false
123
Value of b5: false
```
短路求值可用于确保在使用引用变量前其指向一个对象,例如:
```java
if (objRef != null && objRef.doIt()) { /*...*/ }
```
若 `objRef` 为 `null`,则不会执行 `objRef.doIt()` 方法,避免了 `NullPointerException`。
### 2.3 条件运算符与逻辑运算符的使用场景
- 当右操作数的求值依赖于左操作数时,使用条件运算符 `&&` 和 `||`。
- 当两个操作数都必须求值时,使用布尔逻辑运算符 `&` 和 `|`。
以下示例展示了条件运算符的微妙之处:
```java
if (i > 0 && i++ < 10) {/*...*/} // i is not incremented if i > 0 is false.
if (i > 0 || i++ < 10) {/*...*/} // i is not incremented if i > 0 is true.
```
## 3. 三元条件运算符:`?:`
三元条件运算符允许定义条件表达式,语法如下:
```plaintext
<condition> ? <expression1> : <expression2>
```
如果布尔表达式 `<condition>` 为 `true`,则计算 `<expression1>`;否则计算 `<expression2>`。`<expression1>` 和 `<expression2>` 必须计算为兼容类型的值。例如:
```java
boolean leapYear = false;
int daysInFebruary = leapYear ? 29 : 28; // 28
```
三元条件运算符等价于 `if-else` 语句,并且可以嵌套使用,运算符从右向左结合,例如 `(a?b?c?d:e:f:g)` 计算为 `(a?(b?(c?d:e):f):g)`。
## 4. 其他运算符
### 4.1 `new` 运算符
`new` 运算符用于创建对象,包括类和数组的实例。示例如下:
```java
Pizza onePizza = new Pizza(); // Create an instance of the Pizza class.
int[] anArray = new int[5];// Declare and construct an int array of 5 elements.
```
### 4.2 `[]` 运算符
`[]` 符号用于声明和构造数组,以及访问数组元素。示例如下:
```java
int[] anArray = new int[5];
anArray[4] = anArray[3]; // Element at index 4 gets value of element at index 3.
```
### 4.3 `in
0
0
复制全文
相关推荐







