加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 00:42:43 所属栏目:Java 来源:网络整理
导读:参见英文答案 why byte += 1 compile but byte = byte + 1 not?8个 为什么 以下内容有效 byte i=0;i++; 其中以下内容无效 byte i=0;i=i+1; 会是什么原因? 我知道在i 1的情况下,整个值显式递增1(这将是int值),因此将发生编译问题,但是在i的情况下它会做同样
参见英文答案 > why byte += 1 compile but byte = byte + 1 not?8个
为什么
以下内容有效
byte i=0;
i++;

其中以下内容无效

byte i=0;
i=i+1;

会是什么原因?

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

解决方法

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

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

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:中指定

形式E1 op = E2的复合赋值表达式等效于E1 =(T)((E1)op(E2)),其中T是E1的类型,除了E1仅被评估一次.

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

根据JLS – §15.15 Unary Operators:

前缀增量表达式的类型是变量的类型.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读