在Java中,首先执行"+"或"++"?

viv*_*vek 52 java operator-precedence

我在Java中尝试了以下代码

t1 = 5;
t2 = t1 + (++t1);
System.out.println (t2);
Run Code Online (Sandbox Code Playgroud)

我的观点是因为++具有比+更高的优先级,以上变为

t2 = t1 + (++t1);
t2 = t1 + 6;      // t1 becomes 6 here
t2 = 6 + 6;
t2 = 12;
Run Code Online (Sandbox Code Playgroud)

但是,我得到了t2的答案11.谁能解释一下?

Tim*_*m B 76

你几乎是正确的,但你巧妙地误解了优先规则是如何工作的.

比较这两种情况:

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

t1 = 5;
t2 = (++t1) + t1;
System.out.println (t2);
Run Code Online (Sandbox Code Playgroud)

结果是:

11
12
Run Code Online (Sandbox Code Playgroud)

确实说优先级是在评估++之前+,但是直到它到达表达式的那一部分才适用.

你的表达式是X + Y Where Xis t1and Yis(++t1)

X首先评估左分支.然后Y评估右分支,即评估.只有当它涉及到评估Y++执行操作.

优先规则只表示表达式的++"内部" Y,它们没有说明操作的顺序.

  • 我喜欢/讨厌当你看到这两个陈述时,你似乎正在把'a = b + c`变成'a = c + b`然而它们会产生两种不同的结果. (8认同)

Chr*_*s K 55

你的逻辑很接近,但不是很正确.对于+运算符,评估顺序为从左到右.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;
Run Code Online (Sandbox Code Playgroud)

可视化为您拥有的树,

    +
  /   \
 t1   ++t1
Run Code Online (Sandbox Code Playgroud)

优先顺序

当两个运算符共享一个操作数时,优先级较高的运算符优先.例如,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,因为/运算符具有从左到右的关联性.

  • IMO"逻辑不是那么接近".Vivek在他的问题中混淆了评估顺序和优先级.应该指出它们是完全不同的. (3认同)

JWi*_*ley 15

另一种思考方式是扩展++表达式:

++t1和推杆一样t1 = t1 + 1.

1) t1 = 5;
2) t2 = t1 + (++t1); 
3) t2 = t1 + (t1 = t1 + 1), 
4) t2 = 5 + (t1 = t1 + 1)
5) t2 = 5 + (t1 = 6)
6) t2 = 5 + 6 = 11
Run Code Online (Sandbox Code Playgroud)

如果您要将订单撤消到t2 = (++t1) + t1;那么表达式将扩展为:

1) t2 = (t1 = t1 + 1) + t1     
2) t2 = (t1 = 5 + 1) + t1
3) t2 = (t1 = 6) + t1
4) t2 = 6 + 6 = 12
Run Code Online (Sandbox Code Playgroud)


sub*_*oni 5

向Chris K添加一个观点,

关联性是从左到右

所以,

t2 = t1 + (++t1);
t2 = 5 + 6;      // first t1 is replaced with 5 and then the next 6 
t2 = 11;
Run Code Online (Sandbox Code Playgroud)