java - 字节一元运算

标签 java

我们都知道在Java中这些运算符:

a++;
++a;
a += 1;
a = a + 1;

做同样的事情,他们只是将 1 加到变量 'a'

然而为什么这些说法并不都是真的,这背后的原理是什么?

byte a = 1;
a++;
++a;
a += 1;
a = a + 1; // This line will result to a compile time error

为什么?

最佳答案

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

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

关于java - 字节一元运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17607816/

相关文章:

java - GWT 平台代理

java - 为什么自定义的ExpandableListView在android中不显示

java - 使用 Gson 创建大型 Json 字符串的正确方法

java - Android onAnimationEnd 删除 View (自身)不删除

java - 如何在 vaadin10 或自定义默认主题(lumo)中创建自定义主题

java - Elasticsearch:获取路径下的嵌套对象不是嵌套类型

java - 从巨大的集合中遍历和分组相似对象的有效方法

java - Play 框架 - 在多个调用中保存对象状态

java - 无法建立Cordova Phonegap项目Android

Java AWS DynamoDB如何增加数字