Java int + =双语法惊喜

Java int += double syntax surprise

本问题已经有最佳答案,请猛点这里访问。

我遇到了以下令人惊讶的问题:

1
2
int x = 7;
x += 0.5;

显然是合法的语法!在加法之后,x仍然是7,所以double被强制转换为int并向下取整为0,但这是在代码中没有任何显式强制转换的情况下完成的。还有人对此感到惊讶吗?这里的理由是什么?

编辑以澄清我的问题:有人能为这个决定提供一个很好的理由吗?我觉得在其他地方需要显式强制转换是一个可怕的决定,但是在语言中有一个地方,您会默默地丢弃数据。我错过什么了吗?


1
x += 0.5;

相当于:

1
x = (int) (x + 0.5)

一般来说:

x += y相当于x = (type of x) (x + y)

见1523.2。复合赋值运算符


这是因为复合赋值运算符放置隐式强制转换(自动强制转换):所以

1
x+=0.5 => x =(int)(x + 0.5) => x = (int)(7.5) => x = 7


x += 0.5;x = (int) (x + 0.5);相同。