无法使用表达式增加字节值,但使用增量运算符

Mah*_*rma 7 java byte

为什么以下是有效的

byte i=0;
i++;
Run Code Online (Sandbox Code Playgroud)

其中以下内容无效

byte i=0;
i=i+1;
Run Code Online (Sandbox Code Playgroud)

会是什么原因?

我知道在i+1整个值明确增加1(这将是int值)的情况下,i++因此将发生编译问题,但是如果它做同样但没有得到任何错误.

rac*_*ana 3

每当您在不同类型的两个操作数之间执行二元运算时,其中一个操作数就会提升为更高类型。然后运算的结果就是这个类型。

\n\n

因此,在您的情况下,byte类型 a 首先提升为 an int,因为1是一种int类型。然后进行加法运算后,结果为 类型int。现在,由于您无法将 an 分配int给 a byte,因此您需要进行类型转换以消除编译器错误:

\n\n
byte a = 2;\na = a + 1;   // Error: Cannot assign an int value to byte\na = (byte)(a + 1);  // OK\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,对于复合赋值运算符,类型转换是隐式为您完成的。表达方式:

\n\n
a += 1\n
Run Code Online (Sandbox Code Playgroud)\n\n

内部转换为:

\n\n
a = (byte)(a + 1);\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是在 JLS - \xc2\xa715.26.2 复合赋值运算符中指定的:

\n\n

A compound assignment expression of the form E1 op= E2 is equivalent to E1 = (T) ((E1) op (E2)), where T is the type of E1, except that E1 is evaluated only once.

\n\n

前缀增量运算符和后缀增量运算符的情况类似。

\n\n

根据 JLS - \xc2\xa715.15 一元运算符:

\n\n

The type of the prefix increment expression is the type of the variable.

\n