【问题标题】:unable to increment byte value with expression but with increment operator [duplicate]无法使用表达式但使用增量运算符来增加字节值[重复]
【发布时间】:2013-12-18 14:35:30
【问题描述】:

为什么 以下是有效的

byte i=0;
i++;

以下无效的地方

byte i=0;
i=i+1;

原因是什么?

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

【问题讨论】:

标签: java byte


【解决方案1】:

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

因此,在您的情况下,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.

【讨论】:

  • 非常感谢您指出 JLSs @rachana
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我知道。我的问题是关于 i++ 不能像 i+1 那样工作
    • 没有。 ++ 知道它正在操作的变量的类型并采取相应的行动。与+= 相同。 i+=1 也不会出现任何错误。
    • @MaheshVarma - 在 i++ 中自动(隐式)转换回其原始类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 2023-03-26
    • 2012-11-23
    • 2020-12-19
    • 2016-02-02
    • 2012-12-28
    • 1970-01-01
    相关资源
    最近更新 更多