棘手的基本Java操作



我在 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

每种情况如何运作,它们如何产生这些特定的产出?

这里的主要区别在于postpre增量是什么。 这些决定了该值是在评估之前还是之后增加。

以下是第一种情况在数学上分解的方式:

a = 5 - (4 + 6),减少到-5

请注意,在数学运算完成之前a++aAKApreincrement增加,但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。

最新更新