我只是想创建一个小小的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 +=
之后的术语会被评估为:
所以
int i = 1;
i += ++i + i++ + ++i;
与
相同int i = 1;
i += ((++i) + (i++)) + (++i);
这从左到右进行评估(参见Pre and postincrement java evaluation)。
第一个++i
增加i
到2
并返回2
。所以你有:
i = 2;
i += (2 + (i++)) + (++i);
i++
返回2
,因为它是i
的新值,并将i
增加到3
:
i = 3;
i += (2 + 2) + ++i;
第二个++i
将i
增加到4
并返回4
:
i = 4;
i += (2 + 2) + 4;
所以最终得到的是12
,而不是9
。
我的解释错误在哪里?什么是正确的解释?
答案 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)
答案 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
;
i=1
开始时i += X
- > i = i + X
- > i = 1 + X
(所以我们算一下X)++i
将增加到2和return 2
i++
将return 2
,然后递增至3 ++i
将从3增加到4 return 4
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