int i=2;
i = ++i + ++i + ++i;
哪个更正确?Java 的结果是 12 或 C = 13。或者如果不是正确的问题,请详细说明。
int i=2;
i = ++i + ++i + ++i;
哪个更正确?Java 的结果是 12 或 C = 13。或者如果不是正确的问题,请详细说明。
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 中,两次修改变量而没有中间的序列点是未定义的行为。
没有比这更正确的了。它实际上是未定义的,称为序列点错误。 http://en.wikipedia.org/wiki/Sequence_point
Java 结果对我来说很有意义,因为运算符给出了您所期望的结果,但是任何严肃的程序都不应该包含这样的语句。
编辑:我很高兴这句话的回答是我当晚得分最高的答案(与我发布的其他十几个答案相比,其中一些带有代码示例页面)。这就是人生。
在 C 中,这是未定义的行为。没有正确的行为。