2012-07-11 105 views
11

我只是想创建一个小小的Java-Puzzle,但我迷惑了自己。拼图的一部分是:Java中的前后增量

什么下面的代码做:

public class test { 
    public static void main(String[] args) { 
     int i = 1; 
     i += ++i + i++ + ++i; 

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

它输出9

我的(至少部分)错误解释

我不太清楚,但我想i +=后长期被评价是这样的:

enter image description here

所以

int i = 1; 
i += ++i + i++ + ++i; 

相同
int i = 1; 
i += ((++i) + (i++)) + (++i); 

这从左到右进行评估(请参阅Pre and postincrement java evaluation)。

第一个++i增量为i2并且返回2。所以,你必须:

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

i++返回2,因为它是i新值,和增量i3

i = 3; 
i += (2 + 2) + ++i; 

第二++i增量i4并返回4

i = 4; 
i += (2 + 2) + 4; 

所以你最终得到12,而不是9

我的解释中的错误在哪里?什么是正确的解释?

+2

你确定它输出8吗?因为我输出9. – 2012-07-11 11:48:05

+1

感谢您的提示。它输出9(8是其他难题之一)。然而,9不是12. – 2012-07-11 11:49:15

+1

我得到的输出为9! – Patton 2012-07-11 11:49:39

回答

10

i += ++i + i++ + ++i;相同i = i + ++i + i++ + ++i;

右手侧从左TO-计算正确,产生i = 1 + 2 + 2 + 4;(产生i = 9)。

+0

所以我的想法是正确的,但'i + = s'得到评估到'i = i + s'这不等于'i = s + i',其中's'是一个语句。正确?你有一个事实来源:“i + = a'被评估为'i = i + a'? – 2012-07-11 12:44:10

+2

@moose它全部使用Java语言规范:http://docs.oracle。com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2 – jn1kk 2012-07-11 13:21:35

+0

@jsn感谢您为我链接。麋在这里很好的问题。像这样的情况是,如果你不知道规范或在哪里寻找,数学会变得非常模糊。干杯。 – 2012-07-11 20:52:54

3

您对正确的零件评估是正确的,但您错过了有关任务的详细信息。

运行以下命令:

i = i++; 

或本:

i += i++; 

两次运行后,我仍然有其原始值。

这是因为我在评估的右边部分左边评估左边。

所以在你的情况下,你加8到1,而不是4。

3

输出是(try it

int i = 1; 
i += ++i + i++ + ++i; 

变得

i = 1 + 2 + 2 + 4 
1

它很容易理解它是如何工作的,如果你想象它如何在寄存器中存储值!他把1放在第一个寄存器中,并且通过=符号,并递增i(++ i),所以现在在我有2个,而在第二个寄存器中有2个,但是第一个寄存器没有更新,在第三个寄存器中你有2个,然后我递增,然后我递增,在最后一个寄存器中你将有4.所以你会有这样的东西 1 = 2 + 2 + 4 == 9

1

代码

int i = 1; 
i += ++i + i++ + ++i 

相当于

int tmp1 = i // 1, += 

i ++; // 2 
int tmp2 = i; // 2 

int tmp3 = i; // 2 
i ++; // 3 

i ++; // 4 
int tmp4 = i; // 4 

i = tmp1 + tmp2 + tmp3 + tmp4; // 9 
0

i += ++i + i++ + ++i;

  1. i=1在启动
  2. i += X - >i = i + X - >i = 1 + X(以便允许计数X)
  3. ++i将被增加至2和return 2
  4. i++return 2然后被递增到3
  5. ++i将从3增加到4和return 4
  6. X = 2 + 2 + 4 = 8

所以i = 1 + 8 - >i=9


你会得到12,如果你的代码会是这样的

int i = 1; 
int tmp = ++i + i++ + ++i; 
i += tmp; 

,因为你的代码是i=1,并计算后tmp我会i=4,然后i+=tmp - >i=4+8=12