📜  Java简单赋值和复合赋值的区别

📅  最后修改于: 2021-09-13 02:03:15             🧑  作者: Mango

许多程序员认为语句“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 太大了,不能用短的。自动生成的演员表。它以静默方式删除 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 这样的类型应该谨慎使用。如果我们使用它们,我们必须确保右边的表达式类型不是更高的精度。