在Java中,首先执行“+”或“++”?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

我在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。有人可以解释吗?

提问于
用户回答回答于

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

比较这两种情况:

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

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

结果是:

11
12

优先级确实表示评估++之前+,但不适用,直到它达到表达的那部分。

你的表达形式X + Y 哪里Xt1Y(++t1)

左边的分支,即X,首先被评估。之后,对右分支Y进行评估。只有当它涉及到评估Y++执行操作。

优先规则只是说++Y表达式的“inside” ,他们没有说任何关于操作的顺序。

用户回答回答于

你的逻辑很接近,但不完全正确。+运算符的评估顺序是从左到右。t1位于二进制运算之前,LHS,然后增量位于该二进制运算的右侧。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。

扫码关注云+社区