Java运算符与表达式全解析
立即解锁
发布时间: 2025-08-17 02:35:31 阅读量: 16 订阅数: 22 


Java编程基础与SCJP认证指南
# Java 运算符与表达式全解析
## 1. 整数与字符串拼接及转换
在 Java 中,整数与字符串拼接时,整数会隐式转换为字符串。例如,整数 100 在拼接前会隐式转换为字符串 "100",这个转换过程相当于先创建一个 `Integer` 包装类对象来包装整数 100,然后使用该类的 `toString()` 方法将其转换为字符串,代码如下:
```java
new Integer(100).toString();
```
需要注意的是,如果使用字符字面量 `'%'` 而非字符串字面量 `"%"`,结果会不同。例如:
```java
String trademark2 = 100 + '%' + theName;
// "137 Pure Uranium"
```
这里第一个 `+` 运算符执行的是整数加法,即 `100 + '%'`,也就是 `(100 + 37)`。
另外,`+` 运算符的使用可能会产生意外结果,如:
```java
System.out.println("We put two and two together and get " + 2 + 2);
```
该语句会输出 "We put two and two together and get 22",而不是 "We put two and two together and get 4"。这是因为第一个整数 2 会被提升为字符串 "2" 进行第一次拼接,得到字符串 "We put two and two together and get 2",然后再与字符串 "2" 拼接。过程如下:
```plaintext
"We put two and two together and get " + 2 + 2
"We put two and two together and get " + "2" + 2
"We put two and two together and get 2" + 2
"We put two and two together and get 2" + "2"
"We put two and two together and get 22"
```
为了表达预期的意思,强烈建议使用括号,如下所示:
```java
System.out.println("We put two and two together and get " + (2 + 2));
```
编译器在应用字符串拼接运算符 `(+)` 时,会使用字符串构建器来避免临时字符串对象的开销。
## 2. 变量递增和递减运算符
变量递增 `(++)` 和递减 `(--)` 运算符有前缀和后缀两种形式。这些一元运算符会改变算术操作数的值,操作数必须是变量。根据使用的运算符,变量会递增或递减 1。
### 2.1 递增运算符 `++`
- **前缀递增运算符**:`++i` 会将 `i` 的值加 1,并将新值存储在 `i` 中,然后返回新值作为表达式的值。它等价于以下语句:
```java
i += 1;
result = i;
return result;
```
- **后缀递增运算符**:`j++` 会将 `j` 的值加 1,并将新值存储在 `j` 中,但返回的是 `j` 在存储新值之前的旧值作为表达式的值。它等价于以下语句:
```java
result = j;
j += 1;
return result;
```
### 2.2 递减运算符 `--`
- **前缀递减运算符**:`--i` 会将 `i` 的值减 1,并将新值存储在 `i` 中,然后返回新值作为表达式的值。
- **后缀递减运算符**:`j--` 会将 `j` 的值减 1,并将新值存储在 `j` 中,但返回的是 `j` 在存储新值之前的旧值作为表达式的值。
递增和递减运算符适用于任何数值基本类型或其对应的数值包装类型的变量。在将新值赋给变量之前,会进行必要的数值提升、缩小基本类型转换和/或装箱操作。
以下是一些示例来说明递增和递减运算符的行为:
```java
// (1) 前缀顺序:在使用操作数之前进行递增/递减
int i = 10;
int k = ++i + --i; // ((++i) + (--i)). k 得到值 21,i 变为 10。
--i; // 仅利用副作用。i 为 9。(表达式语句)
Integer iRef = 10;
// 赋值时进行装箱
k = ++iRef + --iRef; // ((++iRef) + (--iRef)). k 得到值 21,
// iRef 引用一个值为 10 的 Integer 对象。
--iRef; // 仅利用副作用。iRef 引用一个值为 9 的 Integer 对象。(表达式语句)
// (2) 后缀顺序:在使用操作数之后进行递增/递减
long i = 10;
long k = i++ + i--; // ((i++) + (i--)). k 得到值 21L,i 变为 10L。
i++; // 仅利用副作用。i 为 11L。(表达式语句)
```
递增或递减运算符与其操作数可以用作表达式语句。在评估过程中多次修改变量的表达式应尽量避免,因为评估顺序并不总是显而易见的。并且不能对递增和递减运算符进行关联,例如不能写 `(++(++a))`,因为 `++` 的操作数必须是变量,而 `(++a)` 的评估结果是一个值。
在下面的示例中,会进行二元数值提升和隐式缩小转换来修改操作数的值:
```java
byte b = 10;
int i = ++b;
// i 为 11,b 也为 11。
```
下面的示例展示了将递增运算符应用于浮点操作数的情况:
```java
double x = 4.5;
x = x + ++x;
// x 得到值 10.0。
```
## 3. 复习问题分析
### 3.1 问题 5.10
以下哪个陈述是正确的?请选择三个正确答案。
- (a) 表达式 `(1 + 2 + "3")` 计算结果为字符串 "33"。
- (b) 表达式 `("1" + 2 + 3)` 计算结果为字符串 "15"。
- (c) 表达式 `(4 + 1.0f)` 计算结果为浮点值 5.0f。
- (d) 表达式 `(10/9)` 计算结果为整数值 1。
- (e) 表达式 `('a' + 1)` 计算结果为字符值 'b'。
分析:
- (a) 先计算 `1 + 2` 得到 3,再与 "3" 拼接,结果为 "33",正确。
- (b) 先将 "1" 与 2 拼接得到 "12",再与 3 拼接,结果为 "123",错误。
- (c) 4 会自动提升为浮点型与 1.0f 相加,结果为 5.0f,正确。
- (d) 10 和 9 都是整数,相除结果取整为 1,正确。
- (e) 'a' 的 ASCII 值加 1 得到 98,对应的字符是 'b',但这里是整数运算,结果是整数 98,错误。
### 3.2 问题 5.11
当你尝试编译并运行以下程序时会发生什么?
```java
public class Prog1 {
public static void main(String[] args) {
int k = 1;
int i = ++k + k++ + + k; // (1)
System.out.println(i);
}
}
```
分析:
- `++k` 先将 k 加 1 变为 2,然后使用 2。
- `k++` 使用 k 的当前值 2,然后将 k 加 1 变为 3。
- `+ k` 就是 3。
- 所以 `i = 2 + 2 + 3 = 7`,答案选 (d)。
### 3.3 问题 5.12
以下程序中,哪一行代码会导致编译时错误?
```java
public class MyClass {
public static void main(String[] args) {
char c;
int i;
c = 'a'; // (1)
i = c; // (2)
i++; // (3)
c = i; // (4)
c++; // (5)
}
}
```
分析:
- (1) 给字符变量 c 赋值 'a',合法。
- (2) 字符 'a' 可以自动提升为整数赋值给 i,合法。
- (3) 对整数 i 进行递增操作,合法。
- (4) 整数 i 不能直接赋值给字符变量 c,需要强制类型转换,会导致编译错误。
- (5) 对字符变量 c 进行递增操作,合法。
答案选 (d)。
### 3.4 问题 5.13
编译并运行以下程序会有什么结果?
```java
public class Cast {
public static void main(Strin
```
0
0
复制全文
相关推荐








