【问题标题】:Why b=b+1 when b is a byte won't compile but b+=1 compiles [duplicate]为什么当b是一个字节时b = b + 1不会编译但b + = 1编译[重复]
【发布时间】:2016-06-19 07:31:35
【问题描述】:

这是我的代码:

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 编译正确,而它们似乎在做同样的事情。

【问题讨论】:

  • 你是说编译器没有为你“描述原因”????
  • 错误 -> (不兼容的类型:从 int 到 byte 的可能有损转换)。但在这种情况下,“b+=1”编译器是如何做到的

标签: java


【解决方案1】:

这是一个有趣的问题。见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

【讨论】:

    【解决方案2】:

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

    当你这样做时:

    byte b = 127;
    b=b+1; 
    

    您会产生溢出,因此解决方案将是投射结果

    b=(byte) (b+1); 
    

    【讨论】:

      【解决方案3】:

      因为无法将 int 转换为 byte

      你可以试试:

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

      【讨论】:

      • "b+=1"在这种情况下是如何工作的?
      • b+=1 等于 b=(byte) (b+1);
      猜你喜欢
      • 1970-01-01
      • 2011-08-10
      • 2019-08-07
      • 2022-01-12
      • 2021-10-06
      • 2014-03-29
      • 2020-02-04
      • 2018-06-22
      • 1970-01-01
      相关资源
      最近更新 更多