6.为什么Java的+ =,-=,* =,/ =复合赋值运算符不需要强制转换? | Java Debug 笔记

本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看<活动链接>

提问:为什么Java的+ =,-=,*=,/=复合赋值运算符不需要强制转换?

直到今天,我还以为例如:

i += j;
复制代码

只是以下代码的简单表达:

i = i + j;
复制代码

但是,如果我们将变量设置为不同的类型

int i = 5;
long j = 8;
复制代码

然而 i = i + j不会通过编译,而i += j会通过编译

这是否意味着着实际上i += j是类似 i = (type of i) (i + j)的捷径?

回答1:

这个回答借鉴了oracle的文档,所以这里直接翻译文档中回答本文问题的部分

形式为

E1 op = E2
复制代码

的复合赋值表达式等效于

E1 =(T) ( (E1) op (E2) )
复制代码

,其中T是E1的类型,两个表达式的不同之处在于E1仅使用了一次。

image.png

short x = 3;
x += 4.6;
复制代码

等价于

short x = 3;
x = (short)(x + 4.6);
复制代码

因此可以通过编译,并且答案为7

在评论区找到了一个有趣的用法:

char ch = 'A';
ch += 32;
System.out.println(ch); // 输出为 'a'

复制代码

如果这个特性和其他的问题一起出现,就会出现令人困惑的结果(这个也是在评论区看到的):

public static void main(String[] args) {
        int x = 33333333;
        float y = x + 1.0f;
        x += 1.0f;
        System.out.println(x);
        System.out.println(y);
    }
复制代码

文章翻译自Stack Overflow :stackoverflow.com/questions/8…

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享