11

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

下面这段代码是做什么的:

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

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

它输出9.

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

我不太确定,但我认为 after 的术语i +=是这样评估的:

在此处输入图像描述

所以

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

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

4

6 回答 6

10

i += ++i + i++ + ++i;是相同的i = i + ++i + i++ + ++i;

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

于 2012-07-11T11:51:31.050 回答
3

关于正确的部分评估,您是对的,但是您缺少有关作业的详细信息。

运行这个:

i = i++;

或这个 :

i += i++;

两次操作后, i 仍然具有其原始值。

那是因为 i 在分配的右侧之前在左侧进行评估。

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

于 2012-07-11T11:49:07.683 回答
3

输出为9试试看

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

变成

i = 1 + 2 + 2 + 4
于 2012-07-11T11:49:17.573 回答
1

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

于 2012-07-11T11:55:31.273 回答
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
于 2012-07-11T12:01:47.240 回答
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++willreturn 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 之后i=4,然后i+=tmp->i=4+8=12

于 2012-07-11T12:03:44.620 回答