Java中的赋值运算符是用于给变量分配值的运算符,其中普通赋值运算符是最基础的形式,而复合赋值运算符则是将算术运算和赋值操作结合在一起的简化写法,能减少代码的冗余度。

普通赋值运算符
普通赋值运算符就是=,它的作用是将右侧表达式的结果赋值给左侧的变量,左侧必须是可修改的变量,不能是常量或者表达式。赋值运算的优先级比较低,通常会在其他运算完成之后执行。
下面是普通赋值运算符的基础使用示例:
public class AssignmentDemo {
public static void main(String[] args) {
// 定义整型变量a,赋值为10
int a = 10;
// 定义整型变量b,赋值为a的值
int b = a;
// 输出两个变量的值
System.out.println("a的值是:" + a);
System.out.println("b的值是:" + b);
// 右侧可以是表达式,先计算表达式结果再赋值
int c = a + b * 2;
System.out.println("c的值是:" + c);
}
}
复合赋值运算符
复合赋值运算符是Java提供的简化写法,它将算术运算和赋值操作合并为一个运算符,常见的复合赋值运算符包括+=、-=、*=、/=、%=等。这类运算符的执行逻辑是:先对左侧变量和右侧表达式进行对应的算术运算,再将运算结果赋值给左侧变量。
常见复合赋值运算符说明
不同复合赋值运算符的功能如下表所示:
| 运算符 | 含义 | 等价普通写法 |
|---|---|---|
| += | 加法赋值 | var = var + 表达式 |
| -= | 减法赋值 | var = var - 表达式 |
| *= | 乘法赋值 | var = var * 表达式 |
| /= | 除法赋值 | var = var / 表达式 |
| %= | 取模赋值 | var = var % 表达式 |
复合赋值运算符使用示例
下面通过代码展示复合赋值运算符的实际使用效果:
public class CompoundAssignmentDemo {
public static void main(String[] args) {
int num = 20;
// 加法赋值,等价于 num = num + 5
num += 5;
System.out.println("加法赋值后num的值:" + num); // 输出25
// 减法赋值,等价于 num = num - 3
num -= 3;
System.out.println("减法赋值后num的值:" + num); // 输出22
// 乘法赋值,等价于 num = num * 2
num *= 2;
System.out.println("乘法赋值后num的值:" + num); // 输出44
// 除法赋值,等价于 num = num / 4
num /= 4;
System.out.println("除法赋值后num的值:" + num); // 输出11
// 取模赋值,等价于 num = num % 3
num %= 3;
System.out.println("取模赋值后num的值:" + num); // 输出2
}
}
使用注意事项
在使用复合赋值运算符时,有一个容易被忽略的点:复合赋值运算符会隐式进行类型转换,即使运算结果类型和左侧变量类型不匹配,也会自动转换为左侧变量的类型,而普通赋值运算符如果没有显式转换会直接编译报错。
下面通过示例说明这个差异:
public class TypeCastDemo {
public static void main(String[] args) {
int x = 10;
// 右侧是long类型,普通赋值需要强制转换,否则编译报错
// x = x + 5L; // 这行会报错
x = (int)(x + 5L); // 需要显式强制转换
// 复合赋值运算符会隐式转换,不需要手动强制转换
x += 5L; // 自动将long类型结果转换为int赋值给x
System.out.println("x的值:" + x);
}
}
另外需要注意,复合赋值运算符左侧必须是变量,不能是字面量或者表达式,比如10 += 5这种写法是错误的,编译时无法通过。