直到今天,我还以为:
i += j;
Run Code Online (Sandbox Code Playgroud)
只是一个捷径:
i = i + j;
Run Code Online (Sandbox Code Playgroud)
但是如果我们试试这个:
int i = 5;
long j = 8;
Run Code Online (Sandbox Code Playgroud)
然后i = i + j;将不会编译但i += j;将编译正常.
这是否意味着事实上i += j;是这样的捷径
i = (type of i) (i + j)?
java casting operators variable-assignment assignment-operator
在Java中,当你这样做
int b = 0;
b = b + 1.0;
Run Code Online (Sandbox Code Playgroud)
您可能会丢失精度错误.但是,如果你这样做,为什么呢?
int b = 0;
b += 1.0;
Run Code Online (Sandbox Code Playgroud)
没有任何错误?
可能重复:
可能导致精度损失的不同行为
代码示例A.
public class Test {
public static void main(String[] args) {
int i = 0;
i = i + 1.5;
}
}
Run Code Online (Sandbox Code Playgroud)
代码示例B.
public class Test {
public static void main(String[] args) {
int i = 0;
i += 1.5;
}
}
Run Code Online (Sandbox Code Playgroud)
不出所料,编译A会产生以下错误.令人惊讶的是,编译B不会产生任何错误,并且它看起来像在双值1.5之前插入一个显式转换为整数.为什么世界会发生这种情况?这违背了我认为我知道的一切!
Test.java:6: possible
loss of precision
found : double
required: int
i = i + 1.5;
^
1 error
Run Code Online (Sandbox Code Playgroud) 考虑以下:
int a = 1;
double b = 0.5;
System.out.println(a += b); // case x
System.out.println(a = a + b); // case y
Run Code Online (Sandbox Code Playgroud)
显而易见的是,上面甚至没有编译 - 由于"不兼容的类型",情况y将失败.如果我自己运行case x,它只会返回一个.
这里发生了什么?简写操作符(+ =)是否"捕获"失败的赋值并且默认只返回lhand值?如果是这样,那么声称a + = b等于a = a + b是否真的是正确的,这在教程中很常见?