我在 Java 中得到了这两个不同的代码,我不明白它们是如何产生这些特定输出的。
他们似乎以 2 种不同的逻辑工作,我无法弄清楚!
int a = 5;
int b = 4;
a -= (b++) + ++a; // For more confusing results replace -= with += and see how the logic changes.
System.out.println(a); // Output: -5
和
int c = 8;
c += ++c;
System.out.println(++c); // Output: 18
每种情况如何运作,它们如何产生这些特定的产出?
这里的主要区别在于post
和pre
增量是什么。 这些决定了该值是在评估之前还是之后增加。
以下是第一种情况在数学上分解的方式:
a = 5 - (4 + 6)
,减少到-5
。
请注意,在数学运算完成之前,a
从++a
AKApreincrement
增加,但b
计算为4
。 需要注意的另一件事是,从-=
中使用的a
使用原始a
值,而不考虑后置或前递增。
第二个等式在数学上简化为:
c = 8 + 9
减少到17
.
输出打印18
,因为您的System.out.print(++c)
在输出之前再递增一次,因为它是预递增的。 请注意,如果print
语句使用c++
,则该值将打印为17
。
可在此处找到运算符优先级图表。 请注意,赋值的优先级低于一元/后缀运算符。
这完全与 Java 中的运算符优先级有关。检查该表并找出哪个操作先发生,哪个操作最后发生。
它相当于:
int a = 5;
int b = 4;
a -= (b++) + ++a; // => 5 -= (4) + 6
int c = 8;
c += ++c; // => 9 += 9
主要区别是:
++a 和 ++c 递增该值并立即返回它。
b++ 返回该值,然后递增它。
++的顺序有所不同。 当两者都增加变量时,++a 会将原始值传递给中间的操作链;而 A++ 将传递新值。 所以对于你的第一个例子:
++a --> a is now 6; but the equation is using 5:
a -= (b++) + 5;
b++ --> b is now 5;
a -= 5 + 5;
a -= 10;
? = 5 - 10;
a = a - 5 + 5;
a = 5 - 5 + 5;
a = -10;
(您应该有足够的时间来跟踪第二个示例(。
有关操作列表,请尝试此操作。 这里还有一些增量示例。
一个最小的例子是">
int x=3,y=3;
x += ++x;
y+= y++;
在 x x 处为 7,y 为 6。仅凭优先顺序不足以解释这种行为。使用优先级,第二行将是x += (++x)
,即递增 x 并返回其值(x 现在是 4(;接下来我们有x+=4
它将返回 8。
相反,似乎最好将x += w
视为x = x + w
的简写,这种重写发生在评估之前。在我们的例子中,重写x = x + ++x
被解释为x = (x + (++x))
。所以解释为
x = ( 3 + (++x))
x = ( 3 + 4 ) x is 4
x = 7 x is 7
一个 simlar 系统工作到 y 方程,最后给出 y = 6。