在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,其中X
是t1
, Y
是(++t1)
左边的分支,即X
,首先被评估。 之后评估右分支,即Y
只有在评估Y
时才执行++
操作。
优先规则只是说++
是在Y
expression式的“内部”,他们对操作的顺序没有任何说明。
你的逻辑很接近,但不太正确。 对于+运算符,评估的顺序是从左到右。 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式:
++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;
然后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
然后++t1
到6
,因此结果为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