猿问

包含前增量和后增量的函数的结果不同

我必须理解一些混合函数前后增量的代码。有一件事让我很困惑。


所以我尝试测试一些较小的功能。但我无法解释以下行为:


int i = 1;

i = i++ * ++i * 2;

System.out.println("i = " + i);

int x = 1;

x = ++x * x++ * 2;

System.out.println("x = " + x);

预期的输出是:


 i = 8

 x = 8

但实际上是:


 i = 6

 x = 8

有人能告诉我为什么吗?


小唯快跑啊
浏览 131回答 2
2回答

动漫人物

i++ * ++i * 2--> 1 * 3 * 2 --> 6++x * x++ * 2--> 2 * 2 * 2 --> 8重要值以粗体显示。Java 中返回值时前缀和后缀递增的区别可以由 Oracle 自己更好地总结(为了突出显示,我再次加粗):可以在操作数之前(前缀)或之后(后缀)应用递增/递减运算符。代码结果++;和++结果;两者都将以结果递增 1 结束。唯一的区别是前缀版本 (++result) 评估为增量值,而后缀版本 (result++) 评估为原始值。如果您只是执行简单的递增/递减,那么选择哪个版本并不重要。但是,如果您在较大表达式的一部分中使用此运算符,则您选择的运算符可能会产生重大差异。在您的特定情况下,由于后缀的计算结果为原始值,并且相同算术运算符的运算顺序从左到右 - 此处仅适用乘数 - 您的运算将按上述方式进行翻译。

www说

后增量增加了的值i,但不会立即分配新的值i。预增量增加值i并立即分配新值。因此,在您的 y, after 示例中i++,i已经成为2但它仍然坚持以前的价值1。发生时++i,iwith 的值会增加1,同时赋值给新的值3。因此,给了我们的1 * 3 * 2价值。6y也一样x,发生时++x,x立即分配 的新值2。然而,当x++发生时,x 增加了1 但仍被分配了先前的值2。因此,2 * 2 * 2给我们8。
随时随地看视频慕课网APP

相关分类

Java
我要回答