Java中简单赋值和复合赋值的区别
许多程序员认为语句 x += i
只是 x = x + i
的简写。这并不完全正确。这两个语句都是赋值表达式。第二个语句使用简单赋值运算符 ( =
),而第一个语句使用复合赋值运算符。复合赋值运算符有 +=
、 -=
、 *=
、 /=
、 %=
等。
Java 语言规范说复合赋值 E1 op= E2
等价于简单赋值,
E1 = (T) ((E1) op (E2))
,其中 T 是 E1 的类型。
换句话说,复合赋值表达式会自动将它们执行的计算结果转换为左侧变量的类型。如果结果的类型与变量的类型相同,则强制转换无效。但是,如果结果的类型比变量的类型更宽,则复合赋值运算符将执行静默缩小原语转换。尝试执行等效的简单赋值会产生编译错误。
考虑以下示例-
// A Java program that uses compound assignment
// for different types.
class GFG{
public static void main(String s[]) {
short x = 0;
int i = 123456;
x += i; // Casts result to short
System.out.println(x);
}
}
输出结果:
-7616
可能希望在这条语句执行后 x
的值是 123456
,但事实并非如此;运行结果是 -7616
。 int
值 123456
太大而无法放入 short
类型中。 自动生成的转换后的值。 它默默地删除了 int
值的两个高位字节。
// A Java program that uses simple addition
// for different types.
class GFG{
public static void main(String s[]) {
short x = 0;
int i = 123456;
x = x + i; // Causes compilation error
System.out.println(x);
}
}
输出结果:
prog.java:5: error: incompatible types: possible
lossy conversion from int to short
x = x + i;
^
从上面的示例中可以清楚地看出,复合赋值表达式可能会导致不良结果,应谨慎使用: byte
、 short
或 char
等类型。 如果我们使用它们,那么必须确保右边的表达式类型不是更高的精度。