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

我在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 

优先级确实是说在++之前对++进行求值,但是直到到达expression式的那一部分才被应用。

你的expression式是X + Y的forms,其中Xt1Y(++t1)

左边的分支,即X ,首先被评估。 之后评估右分支,即Y 只有在评估Y时才执行++操作。

优先规则只是说++是在Yexpression式的“内部”,他们对操作的顺序没有任何说明。

你的逻辑很接近,但不太正确。 对于+运算符,评估的顺序是从左到右。 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,因为乘法的优先级高于加法。

关联性

当具有相同优先级的两个运算符时,根据其关联性评估该expression式。 例如,x = y = z = 17被视为x =(y =(z = 17)),所有三个variables的值都为17,因为=运算符具有从右到左的关联性(并且赋值语句会计算到右侧的值)。 另一方面,由于/操作符具有从左到右的关联性,72/2/3被视为(72/2)/ 3。

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

++t1t1 = 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; 然后expression式将扩展到:

 1) t2 = (t1 = t1 + 1) + t1 2) t2 = (t1 = 5 + 1) + t1 3) t2 = (t1 = 6) + t1 4) t2 = 6 + 6 = 12 

为了给Chris K增加点数,

关联性是从左到右

所以,

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

+从左到右评估,所以

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

结果在11

评估从左到右发生。 所以实际上发生了什么

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

第二行t1的值是5

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

评估顺序是从左到右。

所以首先t1被评估为5然后++t16 ,因此结果为11

在使用variablesx之前执行++ 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 
 t2 = t1 + (++t1); 

这相当于

 temp = t1 + 1 t2 = t1 + temp; t1= temp; 
 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