web-dev-qa-db-ja.com

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が表示されます。誰かが説明できますか?

52
vivek

あなたはほぼ正しいですが、優先ルールのしくみを微妙に誤解しています。

次の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の形式です。ここで、Xt1で、Y(++t1)です。

左側のブランチ、つまりXが最初に評価されます。その後、右側のブランチ、つまりYが評価されます。 Yの評価に関してのみ、++操作が実行されます。

優先ルールは、++Y式の「内側」であるとだけ述べており、演算の順序については何も述べていません。

76
Tim B

あなたの論理は近いですが、完全ではありません。 +演算子の評価の順序は、左から右です。 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として扱われます。

55
Chris K

もう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
_
15
JWiley

クリスKにポイントを追加するには、

関連性は左から右です

そう、

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

+は左から右に評価されるため、

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

結果は11になります。

3
icza

2行目のt1の値は5です

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

評価の順序は左から右です。

したがって、最初にt1が5に評価され、次に++t16に評価されるため、結果は11として評価されます。

2
Rahul Tripathi

評価は左から右に行われます。だから実際に何が起こるのですか

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
0
Harshad Patil

++ 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
0
Izu
t2 = t1 + (++t1);

これは

temp = t1 + 1
t2 =  t1 + temp;
t1= temp;
0
mirmdasif