2016-06-19 83 views
3

这是我的代码:为什么B = B + 1当B是字节不会编译,但B + = 1编译

class Example{ 
    public static void main(String args[]){ 
     byte b=10; 
     //b=b+1; //Illegal 
     b+=1; //Legal 
     System.out.println(b); 
    } 
} 

我想知道为什么我得到一个编译错误,如果我使用b=b+1,但另一方面b+=1编译正确,而他们似乎做同样的事情。

+0

你是说编译器并没有“说明理由”您????? –

+0

错误 - >(不兼容的类型:从int到byte的可能有损转换)。但在这种情况下“b + = 1”在这种情况下,编译器如何做到这一点 –

回答

5

这是一个有趣的问题。见JLS 15.26.2. Compound Assignment Operators:形式E1 op= E2

的化合物赋值表达式是等效于 E1 = (T) ((E1) op (E2)),其中TE1类型,不同之处在于E1 只计算一次。

所以,当你正在编写b+=1;,你实际上是铸造结果为byte,这是类似的表达如(byte)(b+1)和编译器会知道你在说什么。相反,当您使用b=b+1时,您将添加两种不同的类型,因此您将得到一个Incompatible Types Exception

0

因为不能转换的int字节

可以尝试:

B =(字节)(B + 1);

+0

“b + = 1”它是如何工作的? –

+0

b + = 1等于b =(字节)(b + 1); – ThiepLV

1

您得到的错误是由于使用不同数据类型的操作而导致溢出。

,当你这样做:

byte b = 127; 
b=b+1; 

你产生溢出,因此该解决方案将被铸造的结果

b=(byte) (b+1); 
相关问题