++ i + ++ i + ++ i in Java vs C.

Man*_*nny 5 c java operator-precedence undefined-behavior

int i=2;
i = ++i + ++i + ++i;
Run Code Online (Sandbox Code Playgroud)

哪个更正确?Java的结果是12或C = 13.或者如果不是正确的问题,请详细说明.

Mat*_*hen 26

Java保证(第15.7.1节)它将从左到右进行评估,给出12.具体来说,++具有更高的优先级+.所以它首先绑定那些,然后它从左到右关联添加操作

i = (((++i) + (++i)) + (++i));
Run Code Online (Sandbox Code Playgroud)

§15.7.1表示首先评估左操作数,§15.7.2表示在操作之前评估两个操作数.所以评估如下:

i = (((++i) + (++i)) + (++i));
i = ((3 + (++i)) + (++i)); // i = 3;
i = ((3 + 4) + (++i)); // i = 4;
i = (7 + (++i)); // i = 4;
i = (7 + 5); // i = 5;
i = 12;
Run Code Online (Sandbox Code Playgroud)

在C中,修改变量两次没有序列点是未定义的行为.

  • 将它改为`++ i - ++ i - ++ i`,从左到右的顺序变得非常重要. (3认同)

Roh*_*hit 17

没有比这更正确的了.它实际上是未定义的,它被称为序列点错误. http://en.wikipedia.org/wiki/Sequence_point

  • 它在Java中定义得很好. (15认同)

Jos*_*shD 5

在 C 语言中,这是未定义的行为。没有正确的行为。


Tim*_*ora 5

Java结果对我有意义,因为运算符给出了你期望的结果,但没有严肃的程序应该包含这样的语句.

编辑:我很高兴这句话的回答是我当晚得分最高的答案(与我发布的十几个其他答案相比,有些还有代码样本页面).这就是人生.