java 初学者,运算符优先 table

java beginner, operator precedence table

我查看运算符优先级 table 和 ++ 运算符在 = 运算符之前。但是要计算这个表达式, b=a++; 首先,a 被分配给 b,然后 a 递增。 这令人困惑。 ++ 或 = 哪个先出现?

例如,您可以阅读 this tutorial,它表示 increment/decrement 运算符具有最高优先级,而赋值运算符具有最低优先级。因此,在您的示例中,首先 a++ 将被执行,然后 a 的先前值将被分配给 b.

请注意,即使使用括号也无法更改您的案例中的优先级:(b=a)++ 是编译错误。

是的,++precedence 高于 =。但是您需要将 ++ post 递增运算符视为 2 个操作——递增变量并产生旧值——它们发生在优先级较低的运算符 = 之前。

事情是这样的:

  1. Post-自增运算符++:自增a.
  2. Post-increment Operator ++: Yield the old value of a.
  3. 运算符=:将a的旧值赋值给b

相当于这段代码。

int resultOfPostIncrement = a;
a = a + 1;
b = resultOfPostIncrement;

与许多人似乎认为的相反,当我们写 int b = a++; 时,b 在递增 a 之前没有被赋值。它被分配了 a 值,但在时间轴上 latera 的实际增量。

因此,它与优先级告诉您的并不矛盾。


为了说服你,这里有一个让我信服的小例子:

int a = 1;
int b = a++ + a++;

最后,b等于3,不是2,a也是3。因为优先级的关系是:

  • 左边的 a++ 首先求值,递增 a,但根据运算符
  • 的定义,仍然求值为之前的值 1
  • a++被求值,读取新值2(证明第一次递增已经发生),递增到3,但还是求值到2
  • 求和1 + 2,赋值给b

这是因为您应该将 a++ 视为指令和表达式。

  • 指令递增a
  • 表达式的计算结果为 a
  • 的前一个值

b = a一样的东西,也是指令和表达式:

  • 指令将a的值赋值给b
  • 表达式的计算结果为指定的值