【Stackoverflow好问题】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)呢?


精华回答:

这个问题,其实官方文档中已经解答了。 请看这里。§15.26.2
Compound Assignment Operators
.

再照搬下官方文档的说明

对复合赋值表达式来说,E1 op= E2(诸如i += j;i-=j等等),其实是等同于E1 = (T)((E1) op (E2)),其中,T是E1这个元素的类型。

举例来说,如下的代码

short x = 3;
x += 4.6;

等于

short x = 3;
x = (short)(x + 4.6);

stackoverflow链接

http://stackoverflow.com/questions/8710619/java-operator

专栏介绍:

非常喜欢stackoverflow,总能在上面找到疑难杂症的解决办法。偶然发现该网站有一个热度榜单。于是精选了热度较高的一些问题,阅读每个问题的答案,然后按照自己的理解梳理出来。因此,这些文章不是真正的翻译,而是按照自己的理解做了一些增删、润色,希望能把上面的讨论,更精简有效地分享给大家。

如需转载,请注明原文地址

http://blog.csdn.net/lizeyang

时间: 2024-11-07 02:41:24

【Stackoverflow好问题】Java += 操作符实质的相关文章

JavaSE复习日记 : Java操作符\关系运算符\逻辑运算符\赋值运算符\字符串连接符\三元运算符

// Java操作符\关系运算符\逻辑运算符\赋值运算符\字符串连接符\三元运算符 /* * 一 Java操作符 * * Java操作符都有哪些? * +, -, *, /, %, ++, -- * 这里需要注意 a++ 和 ++a 的区别,后面说; */ /* public class Javase{ public static void main(String[] args){ int a = 10; int b = 20; int c = 30; System.out.println( a

[THINKING IN JAVA]操作符

3 操作符 3.1 static import 可以static import静态方法和变量,这样就可以在不写类名的前提下调用类中的静态方法和变量: package com.chenlei.study.thinkinginjava; import static java.lang.System.out; import static java.lang.Integer.parseInt; public class StaticImport { public static void main(Str

Java操作符

优先级 操作符用于操作数据并生成一个新值,当一个表达式中存在多个操作符时,操作符的优先级就决定了各部分的运算顺序.Java 对运算顺序做了特别的规定(最简单的就是先乘除后加减),而程序员经常会忘记一些运算顺序,所以应该用括号明确规定运算顺序. 1 public class Precedence { 2 public void main(String[] args) { 3 int x = 1, y = 2, z = 3; 4 int a = x + y - 2 / 2 + z; 5 int b

Java操作符,<<、>>等

数学意义:在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方. 计算:3 << 2 3 << 2,则是将数字3左移2位 1.首先把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011 2.然后把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,最后在低位(右侧)的两个空位补零. 3.则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 1100,

Java操作符总结

Java语言中的表达式是由运算符与操作数组合而成的,所谓的运算符就是用来做运算的符号.        在Java中的运算符,基本上可分为算术运算符.关系运算符.逻辑运算符.位运算符.赋值运算符.转型运算符等. 一.算术运算符       所谓算术运算符,也就是我们数学中学到的加.减.乘.除等运算.这些操作可以对几个不同类型的数字进行混合运算,为了保证操作的精度,系统在运算的过程中会做相应的转换.      1.数字精度       所谓数字精度,也就是系统在做数字之间的算术运算时,为了尽最大可能

Thinking In Java笔记(第三章 操作符)

第三章 操作符 3.2使用Java操作符 操作符接受一个或者多个参数,并生成一个新值.参数的形式和普通方法调用不同,但是效果是相同的.普通的加减乘除和正负号都是和其他编程语言类似. 有些操作符可能会产生"副作用",改变操作数的值,这些擦佐夫最普通的用途就是用来产生副作用的.使用此类操作符产生的值和没有副作用的操作符产生的值没区别. 几乎左右的操作符都只能操作"基本类型",例外的是"=","==","!=",

JAVA编程思想(2) - 操作符(一)

"在最底层,Java中的数据是通过操作符来操作的." 1. 使用Java操作符 -操作符接受一个或者多个參数,并生成一个新值,參数的形式与普通的方法调用不用,但效果是同样的.加号和一元的正号(+).减号和一元的负号(-).乘号(*).除号(/)以及赋值号(=)的使用方法与其它编程语言同样. 2. 优先级 -当一个表达式中存在多个操作符时,操作符的优先级就决定了各个部分的计算顺序. public class Precedence { public static void main(Str

Java编程思想笔记(操作符)

1.更简单的打印语句:print();     2.使用Java操作符:1.例外的操作符“=”.“==”.“!=”,这些操作符能操作所有的对象.2.String支持+=.+     3.优先级     4.赋值:直接操作对象内的域容易导致混乱     4(1).方法调用中的别名问题     5.算数操作符:Random rand = new Random(47);//随机生成器对于特定的种子值总是产生相同的随机数序列     5(1).一元加.减操作符     6.自动递增和递减:++a(先加,

Stackoverflow上人气最旺的10个Java问题

1. 为什么两个(1927年)时间相减得到一个奇怪的结果? (3623个赞) 如果执行下面的程序,程序解析两个间隔1秒的日期字符串并比较: 1 2 3 4 5 6 7 8 9 10 public static void main(String[] args) throws ParseException {     SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");      String str3 = &