在Java中,首先执行的是“+”还是“++”?

2022-08-31 20:03:03

我在Java中尝试了以下代码

t1 = 5;
t2 = t1 + (++t1);
System.out.println (t2);

我的观点是,由于++的优先级高于+,因此上述内容变为

t2 = t1 + (++t1);
t2 = t1 + 6;      // t1 becomes 6 here
t2 = 6 + 6;
t2 = 12;

但是,我得到的答案是t2的11。有人可以解释吗?


答案 1

你几乎是正确的,但你微妙地误解了优先规则的工作原理。

比较以下两种情况:

int t1 = 5;
int t2 = t1 + (++t1);
System.out.println (t2);

t1 = 5;
t2 = (++t1) + t1;
System.out.println (t2);

结果是:

11
12

优先级确实表示要计算 前面的 ,但在到达表达式的该部分之前,这并不适用。+++

您的表达式的形式为 Where is and isX + YXt1Y(++t1)

首先评估左分支,即 。。然后评估正确的分支,即 ,。只有在评估操作时才执行。XYY++

优先规则只说表达式是“内部”,它们没有说明操作顺序。++Y


答案 2

你的逻辑很接近,但并不完全正确。对于 + 运算符,评估顺序为从左到右。t1 出现在二进制 op LHS 之前,然后增量位于该二进制 op 的 RHS 上。首先执行 LHS。

t2 = t1 + (++t1);
t2 = 5 + 6;      // t1 becomes 6 here as a side effect before being read on the RHS
t2 = 11;

想象成你拥有的一棵树,

    +
  /   \
 t1   ++t1

优先顺序

当两个运算符共享一个操作数时,优先级较高的运算符将排在第一位。例如,1 + 2 * 3 被视为 1 + (2 * 3),而 1 * 2 + 3 被视为 (1 * 2) + 3,因为乘法的优先级高于加法。

关联性

当两个具有相同优先级的运算符时,将根据其关联性计算表达式。例如,x = y = z = 17 被视为 x = (y = (z = 17)),使所有三个变量的值为 17,因为 = 运算符具有从右到左的关联性(并且赋值语句的计算结果为右侧的值)。另一方面,72 / 2 / 3被视为(72 / 2) / 3,因为/运算符具有从左到右的结合性。


推荐