私は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が表示されます。誰かが説明できますか?
あなたはほぼ正しいですが、優先ルールのしくみを微妙に誤解しています。
次の2つのケースを比較してください。
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
式の「内側」であるとだけ述べており、演算の順序については何も述べていません。
あなたの論理は近いですが、完全ではありません。 +演算子の評価の順序は、左から右です。 t1はバイナリオペレーションLHSの前にあり、増分はそのバイナリオペレーションの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
優先順位
2つの演算子がオペランドを共有する場合、優先順位の高い演算子が最初に使用されます。たとえば、1 + 2 * 3は1 +(2 * 3)として扱われ、1 * 2 + 3は(1 * 2)+ 3として扱われます。これは、乗算の方が加算よりも優先されるためです。
関連性
優先順位が同じ2つの演算子が関連付けられている場合、式はその関連性に従って評価されます。たとえば、x = y = z = 17はx =(y =(z = 17))として扱われ、3つの変数はすべて値17のままになります。=演算子には右から左への結合性があるため(割り当てステートメントは評価されます)右側の値に)。一方、72/2/3は、(72/2)/ 3として扱われます。
もう1つの考え方は、++式を拡張することです。
_++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
_
クリス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
になります。
2行目のt1の値は5です
t2 = t1 + (++t1)
t2 = 5 + 6; // t1 becomes 6 here
したがって、最初にt1が5
に評価され、次に++t1
が6
に評価されるため、結果は11
として評価されます。
評価は左から右に行われます。だから実際に何が起こるのですか
t2 = t1 + (++t1);
t2 = 5 + 6;
t2 = 11;
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
++ 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
t2 = t1 + (++t1);
これは
temp = t1 + 1
t2 = t1 + temp;
t1= temp;