Java int += double syntax surprise
我遇到了以下令人惊讶的问题:
显然是合法的语法!在加法之后,x仍然是7,所以double被强制转换为int并向下取整为0,但这是在代码中没有任何显式强制转换的情况下完成的。还有人对此感到惊讶吗?这里的理由是什么?
编辑以澄清我的问题:有人能为这个决定提供一个很好的理由吗?我觉得在其他地方需要显式强制转换是一个可怕的决定,但是在语言中有一个地方,您会默默地丢弃数据。我错过什么了吗?
- 有趣。不过,我相信捷豹路虎会解决这个问题。你看过它说什么了吗?
- @气垫船:JLS给出了规格,但没有给出决定的理由,这就是我要问的。
相当于:
一般来说:
x += y相当于x = (type of x) (x + y)。
见1523.2。复合赋值运算符
- 我明白这一点。让我吃惊的是编译器允许它!在第二行中,有一个显式转换,它强制程序员认识到他们可能丢失了一些信息。例如,x=x+.5不编译,但x+=5编译…奇怪,不是吗?
- @埃里克林道尔一点也不奇怪,x + 0.5的收益率是一个双数,而(int) (x + 0.5)是一个整数。
- 我想我不太清楚…我知道规范上说这就是它的工作原理。我的问题是:为什么??如何证明允许X+=5,但不允许X=X+.5?!我觉得这太疯狂了。
- @Ericklindauer简单的int a = 0.5;是无效的,而int a = (int) 0.5是有效的。
- 我认为@ericlindauer所说的应该是:x += 0.5应该与x = (x + 0.5)相当,并且不添加(int)的部分,因为它会导致静默地失去精度。
这是因为复合赋值运算符放置隐式强制转换(自动强制转换):所以
1
| x+=0.5 => x =(int)(x + 0.5) => x = (int)(7.5) => x = 7 |
- 有充分的理由这样做吗?
- @埃里克林道尔:如果x是short,即使y也是,像x = x + y;这样的声明如果没有明确的类型转换也是非法的。Java因此表现为好像任何复合算术赋值操作符所计算的结果被显式类型化到结果类型,无论它在任何特定情况下都有意义。
x += 0.5;与x = (int) (x + 0.5);相同。