奇怪的Java语法

当我遇到这个问题时,我正在做一个练习计算机科学UIL测试表:

什么是以下输出?

int a = 5; int b = 7; int c = 10; c = b+++-c--+--a; System.out.println(a + " " + b + " " + c); 

我回答“由于语法错误没有输出”,但我弄错了。 真正的答案是4 8 1! (我自己测试过)

有人可以向我解释第4行是如何工作的吗?
谢谢

我添加了一些括号:

 int a = 5; int b = 7; int c = 10; c = (b++) + (-(c--)) + (--a); System.out.println(a + " " + b + " " + c); 

b ++:使用 b后b = b + 1

c–:使用 c后c = c – 1

–a:使用之前a = a – 1

看看它像这样:

 (b++) + (-(c--)) + (--a) 

这应该更有意义!

查看Operator Precedence以了解它为何如此工作。

看看像这样的c初始化, c = (b++) + (-(c--)) + (--a);

为了您的学习目的,他们压缩并故意混淆。 代码基本上是这样说的, c = (b + 1) + (-(c - 1)) + (a - 1);

分解一下声明。 这是故意混淆的。

 c = b++ + -c-- + --a; 

这意味着什么:

  • 变量c被赋值为……的结果
    • b (增量将在此行之后生效),加号
    • 一元操作- c (递减将在此行之后生效),加上
    • a (减量立即生效)。

用值替换变量,得到:

 c = 7 + (-10) + 4 c = 1 

…并且您的打印声明的结果应该是:

 4 8 0 

让我们慢下来,仔细看看这个等式。 仔细想想。

 int a = 5; int b = 7; int c = 10; c = b+++-c--+--a; 

b ++表示在赋值后增加b,因此b在等式中保持等于其原始值,但在等式之后将增加。

然后有一个+。

然后是否定的c--c递减,但对于等式保持不变。

然后将其添加到–a,这意味着立即减少。

所以print语句中的变量值将是:

 c = 7 + -10 + 4 = 1 a = 4 b = 8 

我可以补充一点,在我看来这对于测试来说是一个糟糕的问题。 所有它真正的问题是你是否理解i++ vs ++i