java初学者,运算符优先级表

时间:2015-06-12 17:01:33

标签: java operator-precedence

我查看运算符优先级表,++运算符在=运算符之前。但要计算这个表达式, B = A ++; 首先,将a分配给b,然后增加a。 这令人困惑。首先是哪一个,++或=?

3 个答案:

答案 0 :(得分:2)

是的,++的{​​{3}}高于=。但是你需要将++后增量运算符视为2个运算 - 增加变量并产生旧值 - 在优先级较低的运算符=之前发生。

以下是发生的事情:

  1. 增量后运算符++:增量a
  2. 增量后运算符++:产生旧值a
  3. 运营商=:将a的旧值分配给b
  4. 它等同于此代码。

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

答案 1 :(得分:1)

与许多人似乎认为的相反,在我们撰写b时,在递增a之前未分配int b = a++;。在时间轴中为a分配了以前值,但以后的值为a的实际增量。

因此,它与优先权告诉你的内容并不矛盾。

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

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
  • 表达式计算为指定值

答案 2 :(得分:0)

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

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