复合赋值 Operator [i + = j]与Java中的[i = i + j]不同

在我们的日常编程中,我们所有人都使用过类似的语法,i += j并且 已经使用了i = i + j数千次。乍一看,它们看起来很相似。实际上,在实际情况下,几乎所有情况下它们都将产生相同的输出。但是,令您惊讶的是它们并不相似。在运行时,当i和j属于不同类型时,对它们的区别对待。让我们看下面的例子:

int i = 5;
      
double d1 = (double)i + 4.5; //necessary to satisfy compiler
i += 4.5;

System.out.println(i);
System.out.println(d1);

Output:

9
9.5

奇怪的。是不是 两者都期望相同,因为操作相同。为什么它们具有不同的价值?让我们找出答案。

原因

Java语言规范说明如下:

该形式的复合赋值表达式E1 op= E2等效于E1 = (T)((E1) op (E2))其中T是E1的类型,只是E1仅被评估一次。

因此,可以有效地将我们的原始示例代码重写如下:

int i = 5;
   
double d1 = (double) i + 4.5;    
i = (int)(i + 4.5); 		//Result converted to int

System.out.println(i);
System.out.println(d1);

Output:

9
9.5

因此,值9只是从double转换为int时精度损失的结果

学过的知识

始终非常小心地使用复合赋值 Operator [i + = j]。仅在处理类似数据类型时才应使用。在不同的数据类型中,结果可能不正确。

学习愉快!

参考文献

http://stackoverflow.com/questions/8710619/java-operator
http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.26.2

saigon has written 1440 articles

Leave a Reply