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

时间:2013-12-18 06:16:54

标签: java byte

为什么  以下是有效的

byte i=0;
i++;

其中以下内容无效

byte i=0;
i=i+1;

原因是什么?

我知道在i+1的情况下,整个值显式递增1(这将是int值)因此会出现编译问题,但是在i++的情况下它会发生同样但没有得到任何错误。

3 个答案:

答案 0 :(得分:3)

每当您在两个不同类型的操作数之间执行二进制操作时,其中一个操作数将被提升为更高类型。然后操作的结果就是那种类型。

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

byte a = 2;
a = a + 1;   // Error: Cannot assign an int value to byte
a = (byte)(a + 1);  // OK

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

a += 1

在内部转换为:

a = (byte)(a + 1);

这在JLS中指定 - §15.26.2 Compound Assignment Operator:

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.

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

根据JLS - §15.15 Unary Operators:

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

答案 1 :(得分:0)

加/减/乘等。这些操作是通过将RHS中的操作数转换为整数来完成的......所以在这里,你试图将整数(操作完成后产生的RHS值)重新分配给一个字节。砰。 “不能从INT转换为BYTE” - ERROR说明了一切。

答案 2 :(得分:0)

这是因为,当您说i = i + 1时,i的类型为byte,而1的类型为inti + 1的结果是int。将其分配给byte会导致精度损失。