Java中的字节递增操作

6
当我们尝试使用增量运算符和加法运算符来递增一个字节变量时会发生什么。
public class A {
    public static void main(final String args[]) {
        byte b = 1;

        b++;

        b = b + 1;
    }
}

请给我提供能够找到这些小物件的源代码?请帮我一下。

发生了什么事情... 为什么不试一下呢? - ppeterka
请提供源代码,以便我们可以找到这些小东西的来源——Java教程、任何好的Java教材......或者如果您擅长阅读正式文件,可以参考Java语言规范。 - Stephen C
除非你使用 b,否则你看不到任何事情发生。 - Peter Lawrey
@PeterLawrey.. 为什么?实际上第三个语句无法编译。无法将int转换为byte - Rohit Jain
4个回答

13

区别在于使用++运算符时,从intbyte会进行隐式转换,而如果使用b = b + 1,则需要显式转换

b = b + 1;  // Will not compile. Cannot cast from int to byte

您需要进行显式转换:

b = (byte) (b + 1);

b++ 将正常工作。 ++ 运算符会自动将值 b + 1(一个 int 类型)强制转换为 byte 类型。


这在JLS - §15.26.2 复合赋值运算符中有明确说明:-

形如 E1 op= E2 的复合赋值表达式等同于 E1 = (T) ((E1) op (E2)),其中 T 是 E1 的类型,除了 E1 只被计算一次之外


请注意,操作b + 1将会给你一个int类型的结果。这就是为什么你需要在第二个赋值语句中进行显式转换的原因。

但是当我使用int时,它仍然显示错误??? - Praveen
抱歉 Rohit......当我使用你说的显式转换时,仍然会出错。 - Praveen
@Praveen.. 据我所知,它不应该出现错误。你能否请发一下你当前的代码? - Rohit Jain
不,它没有编译成功,Vishal。 - Praveen
1
@Vishal.. 实际上,表达式的结果类型至少为“int”。当您添加更高类型时,结果类型即为该更高类型。以下是不同类型之间的运算:- byte和byte是intint和byte是intint和long是long等等。 - Rohit Jain
显示剩余16条评论

3

发生了什么?实际上,b = b + 1不能编译。

您必须显式地将其转换为byte,因为b+1计算结果是int。而且不能保证一个int可以放入一个byte

b = (byte)(b + 1);


好的,b = b + 1将无法编译。 - Rohit Jain
为什么会这样发生,Rohit? - Praveen
@Praveen,请看我的回答。 - Rohit Jain

0
变量将会被增加两次。

0

b++; 和 b=b+1; 是等效的,并将导致相同的字节码。

在主方法完成之前,b将等于3。

编辑:实际上它们不等效:b=b+1; 是错误的,应该是b=(byte)(b+1); [强制转换为字节,否则它是int]


但是当我执行代码时,却出现了编译时错误? - Praveen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接