我在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。有人可以解释一下吗?
答案 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
X
为t1
且Y
为(++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