このJavaコードの出力について説明してもらえますか?
int a=5,i;
i=++a + ++a + a++;
i=a++ + ++a + ++a;
a=++a + ++a + a++;
System.out.println(a);
System.out.println(i);
どちらの場合も出力は20です
これは役立ちますか?
a = 5;
i=++a + ++a + a++; =>
i=6 + 7 + 7; (a=8)
a = 5;
i=a++ + ++a + ++a; =>
i=5 + 7 + 8; (a=8)
主なポイントは、++a
が値をインクリメントしてすぐに返すことです。
a++
も(バックグラウンドで)値をインクリメントしますが、変数の変更されていない値を返します-後で実行されるように見えます。
++a
はインクリメントしてから変数を使用します。a++
は、変数を使用してから増分します。
あなたが持っている場合
a = 1;
そしてあなたはする
System.out.println(a++); //You will see 1
//Now a is 2
System.out.println(++a); //You will see 3
codaddictの説明 特定のスニペット。
どちらの場合も最初に値を計算しますが、ポストインクリメントでは古い値を保持し、計算後にそれを返します
++ a
a ++
i = ++a + ++a + a++;
は
i = 6 + 7 + 7
Working:aを6にインクリメント(現在の値6)+ aを7にインクリメント(現在の値7)。 Sumは13になり、a(= 7)の現在の値に加算され、aが8にインクリメントされます。合計は20で、割り当て完了後のaの値は8です。
i = a++ + ++a + ++a;
は
i = 5 + 7 + 8
Working:aの開始値は5です。加算で使用し、6にインクリメントします(現在の値6)。 aを現在の値6から7にインクリメントして、他のオペランド+を取得します。合計は12で、aの現在の値は7です。次に、aを7から8にインクリメントし(現在の値= 8)、前の合計12に加算して20を取得します。
++a
は、評価前にa
をインクリメントします。 a++
はa
を評価してから、増分します。
与えられた表現に関連する:
i = ((++a) + (++a) + (a++)) == ((6) + (7) + (7)); // a is 8 at the end
i = ((a++) + (++a) + (++a)) == ((5) + (7) + (8)); // a is 8 at the end
上記で使用した括弧は、Javaで暗黙的に使用されています。このように用語を見てみると、どちらも可換であると同じであることが簡単にわかります。
上記の例では
int a = 5,i;
i=++a + ++a + a++; //Ans: i = 6 + 7 + 7 = 20 then a = 8
i=a++ + ++a + ++a; //Ans: i = 8 + 10 + 11 = 29 then a = 11
a=++a + ++a + a++; //Ans: a = 12 + 13 + 13 = 38
System.out.println(a); //Ans: a = 38
System.out.println(i); //Ans: i = 29
++ aはプレフィックスインクリメント演算子です:
a ++は後置インクリメント演算子です。
ルールを覚えたら、EZ for yaがすべてを計算します!
あなたが意味すると仮定して
int a=5; int i;
i=++a + ++a + a++;
System.out.println(i);
a=5;
i=a++ + ++a + ++a;
System.out.println(i);
a=5;
a=++a + ++a + a++;
System.out.println(a);
これは次のように評価されます。
i = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)
したがって、iは6 + 7 + 7 = 20であるため、20が印刷されます。
i = (5, a is now 6) + (7, a is now 7) + (8, a is now 8)
したがって、iは5 + 7 + 8 = 20であるため、20が再び印刷されます。
a = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)
そして、すべての右側が評価された後(aを8に設定することを含む)、次にaが6 + 7 + 7 = 20に設定され、20が最終的に印刷されます。
ただし、すべてのステートメントを組み合わせてJava 8.1で実行すると、異なる答えが得られると思います。少なくとも私の経験ではそうです。
コードは次のように機能します。
int a=5,i;
i=++a + ++a + a++; /*a = 5;
i=++a + ++a + a++; =>
i=6 + 7 + 7; (a=8); i=20;*/
i=a++ + ++a + ++a; /*a = 5;
i=a++ + ++a + ++a; =>
i=8 + 10 + 11; (a=11); i=29;*/
a=++a + ++a + a++; /*a=5;
a=++a + ++a + a++; =>
a=12 + 13 + 13; a=38;*/
System.out.println(a); //output: 38
System.out.println(i); //output: 29
事前増分とは、変数が式で評価される前に増分されることを意味します。ポストインクリメントは、式で使用するために評価された後に変数がインクリメントされることを意味します。
したがって、注意深く見てみると、3つの割り当てすべてが算術的に同等であることがわかります。
a
が5の場合、a++
は式に5を与えてからa
をインクリメントしますが、++a
はa
をインクリメントしてから式に渡します(この場合、式にa
6を与えます)。
計算する
i = 6 + 7 + 7
i = 5 + 7 + 8
これらすべてのステートメントを異なる方法で実行していると思います
一緒に実行すると、=> 38,29になります
int a=5,i;
i=++a + ++a + a++;
//this means i= 6+7+7=20 and when this result is stored in i,
//then last *a* will be incremented <br>
i=a++ + ++a + ++a;
//this means i= 5+7+8=20 (this could be complicated,
//but its working like this),<br>
a=++a + ++a + a++;
//as a is 6+7+7=20 (this is incremented like this)
a=5; i=++a + ++a + a++;
は
i = 7 + 6 + 7
動作:事前/事後の増分は「右から左」の結合性を持ち、事前は事後よりも優先されるため、まず事前の増分は(++a + ++a) => 7 + 6
として解決されます。 a=7
が提供され、インクリメント=> 7 + 6 + 7 =20
およびa =8
がポストされます。
a=5; i=a++ + ++a + ++a;
は
i=7 + 7 + 6
動作:事前/事後の増分には「右から左」の結合性があり、事前には事後の優先順位があるため、事前の増分はまず(++a + ++a) => 7 + 6
。then a=7
が増分として提供されます=> 7 + 7 + 6 =20
およびa =8
。
事前インクリメントと事後インクリメントは、式にない場合は同等です
int j =0;
int r=0
for(int v = 0; v<10; ++v) {
++r;
j++;
System.out.println(j+" "+r);
}
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10