Java之前和之后的增量

时间:2012-07-11 11:43:54

标签: java

我只是想创建一个小小的Java-Puzzle,但我很困惑。这个难题的一部分是:

下面的代码是做什么的:

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的新值,并将i增加到3

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

第二个++ii增加到4并返回4

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

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

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

6 个答案:

答案 0 :(得分:10)

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

相同

右侧按从左到右的计算,产生i = 1 + 2 + 2 + 4;(产生i = 9)。

答案 1 :(得分:3)

关于正确的评估,您是对的,但是您错过了有关作业的详细信息。

运行:

i = i++;

或者这个:

i += i++;

在两次操作之后,我仍然有其原始值。

那是因为我在作业的右边部分左边进行了评估。

因此,在您的情况下,您要添加8比1,而不是4。

答案 2 :(得分:3)

输出 9 try it

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

变为

i = 1 + 2 + 2 + 4

答案 3 :(得分:1)

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

答案 4 :(得分: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

答案 5 :(得分: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
  7. 所以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