6
int i=2;
i = ++i + ++i + ++i;

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

4

4 回答 4

27

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

i = (((++i) + (++i)) + (++i));

§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;

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

于 2010-10-07T06:42:09.430 回答
18

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

于 2010-10-07T06:27:33.417 回答
5

Java 结果对我来说很有意义,因为运算符给出了您所期望的结果,但是任何严肃的程序都不应该包含这样的语句。

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

于 2010-10-07T06:27:47.587 回答
4

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

于 2010-10-07T06:26:46.840 回答