私はJavaについていくつかの調査を行っていますが、これは非常に紛らわしいと思います:
for (int i = 0; i < 10; i = i++) {
System.err.print("hoo... ");
}
これは終わりのないループです!
なぜそのようなことが起こるのか、誰にも良い説明がありますか?
私はJavaについていくつかの調査を行っていますが、これは非常に紛らわしいと思います:
for (int i = 0; i < 10; i = i++) {
System.err.print("hoo... ");
}
これは終わりのないループです!
なぜそのようなことが起こるのか、誰にも良い説明がありますか?
for (int i = 0; i < 10; i = i++) {
上記のループは、基本的に次のものと同じです: -
for (int i = 0; i < 10; i = i) {
ステートメントの 3番目の部分-は次のように評価されます: -for
i = i++
int oldValue = i;
i = i + 1;
i = oldValue; // 3rd Step
機能させるには、そこから割り当てを削除する必要があります。
for (int i = 0; i < 10; i++) {
(コメントからのOPリクエストに応じて)
x = 1; x = x++ + x++;
: -コメントで指定された問題に関する限り、次の式の結果: -
x = 1;
x = x++ + x++;
は次のように取得されます: -
2 番目のステートメントのさまざまな部分に印を付けましょう: -
x = x++ + x++;
R A B
ここで、最初に RHS 部分(A + B)
が評価され、次に最終結果が に割り当てられx
ます。それでは、先に進みましょう。
最初A
に評価されます: -
old1 = x; // `old1 becomes 1`
x = x + 1; // Increment `x`. `x becomes 2`
//x = old1; // This will not be done. As the value has not been assigned back yet.
A
さて、ここではtoの代入はしR
ていないので、3番目のステップは実行しません。
さて、評価に移りましょうB
: -
old2 = x; // old2 becomes 2. (Since `x` is 2, from the evaluation of `A`)
x = x + 1; // increment `x`. `x becomes 3`.
// x = old2; // This will again not be done here.
ここで、 の値を取得するには、とx++ + x++
の評価で残した最後の割り当てを行う必要があります。そのためには、以下を置き換える必要があります: -A
B
x
A --> old1
B --> old2 // The last assignment of both the evaluation. (A and B)
/** See Break up `x = old1;` towards the end, to understand how it's equivalent to `A = old1; in case of `x = x++`, considering `x++ <==> A` in this case. **/
したがって、x = x++ + x++
は次のようになります。
x = old1 + old2;
= 1 + 2;
= 3; // Hence the answer
x = x++
にどのように機能するかを確認しますx = x++ + x++
: -の場合のように、なぜ置換がではA --> old1
なくとして行われるのだろうか。x --> old1
x = x++
一部、特に最後の課題を詳しく見てみましょうx = x++
: -
x = oldValue;
あなたがここにいると考えるならx++
、A
上記の割り当ては次のステップに分けることができます: -
A = oldValue;
x = A;
さて、現在の問題については、次と同じです: -
A = old1;
B = old2;
x = A + B;
それが明確になることを願っています。
post-increment: を使用しています。i = i++;
これは次のような意味です。
temp = i;
i = i + 1;
i = temp;
後置インクリメント式の値は、新しい値が格納される前の変数の値です。
それがあなたが古い価値観を持っている理由です。
forループが正しく行われました:
for (int i = 0; i < 10; i++) {
System.err.print("hoo... ");
}
i=i++ のため
for (int i = 0; i < 10; i++) {
System.err.print("hoo... ");
}
i++ は i の値を報告し、THEN はインクリメントします。これは、i を i++ に等しく設定する必要がないことも意味します。
for (int i = 0; i < 10; i++) {