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

时间:2014-09-10 09:02:00

标签: java operator-precedence

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

10 个答案:

答案 0 :(得分:76)

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

比较这两种情况:

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表达式的“内部”,他们没有说明操作顺序。

答案 1 :(得分: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;

可视化为您拥有的树,

    +
  /   \
 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,因为/运算符具有从左到右的关联性。

答案 2 :(得分: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

如果您要将订单撤消到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

答案 3 :(得分:5)

向Chris K添加一个点,

关联性是从左到右

所以,

t2 = t1 + (++t1);
t2 = 5 + 6;      // first t1 is replaced with 5 and then the next 6 
t2 = 11;

答案 4 :(得分:3)

从左到右评估+,所以

t1 + (++t1)     // Left side is evaluated to 5, right side evaluated to 6...
5  + (6)        // ...and as a side effect t1 becomes 6

11中的结果。

答案 5 :(得分:2)

第二行中t1的值为5

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

evaluation order is from left to right.

因此,首先将t1评估为5,然后++t1评估为6,因此结果为11

答案 6 :(得分:2)

评估从左到右进行。所以实际发生的是

t2 = t1 + (++t1);
t2 = 5 + 6;      
t2 = 11;

答案 7 :(得分:0)

++ x在使用变量x之前执行,x ++在使用之后增加x:

x=5;
y=x++;
y is 5;
and x is 6

x=5;
y=++x;
y is 6;
and x is 6

答案 8 :(得分:0)

t2 = t1 + (++t1);

这相当于

temp = t1 + 1
t2 =  t1 + temp;
t1= temp;

答案 9 :(得分:0)

enter code here
t1 = 5;
t2 = t1 + (++t1);
// it takes 5 for t1 and as it moves further to (++t1), it increments t1 to 6, so it takes 6 for  (++t1)
t2 = 5 + 6;
// (++t1) this increments t1 by 1 then return new value. So (++t1)=6
// (t1++) this returns old value n then increments t1 by 1. So (t1++)=5