本文正在参加「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仅使用了一次。
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