在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)
没有任何错误?
我遇到了以下令人惊讶的问题:
int x = 7;
x += 0.5;
Run Code Online (Sandbox Code Playgroud)
显然是合法的语法!添加后,X仍然是7,所以双被转换为int并四舍五入到0,但这是没有代码中的任何显式转换完成.有人对此感到惊讶吗?这里的理由是什么?
编辑以澄清我的问题:任何人都可以给出这个决定的充分理由吗?我觉得这是一个可怕的决定,要求在其他任何地方进行显式投射,但是在你默默抛弃数据的语言中有这一点.我错过了什么吗?
考虑以下:
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是否真的是正确的,这在教程中很常见?