In programming, particularly in Java, what is the difference between:
int var = 0;
var++;
and
int var = 0;
++var;
What repercussions would this have on a for loop?
e.g.
for (int i = 0; i < 10; i++) {}
for (int i = 0; i < 10; ++i) {}
In programming, particularly in Java, what is the difference between:
int var = 0;
var++;
and
int var = 0;
++var;
What repercussions would this have on a for loop?
e.g.
for (int i = 0; i < 10; i++) {}
for (int i = 0; i < 10; ++i) {}
と の両方が適用される変数をインクリメントしますが、 によって返される結果はvar++
インクリメント前の変数の値ですが、 によって返される結果はインクリメントが適用された後の変数の値です。++var
var++
++var
++var
または(あなたの例のように)完全なステートメントを形成する場合var++
、2つの間に違いはありません。たとえば、次の
int x = 6;
++x;
assert x == 7;
と同じです
int x = 6;
x++;
assert x == 7;
ただし、++var
またはvar++
がより大きなステートメントの一部として使用される場合、この 2 つは同等ではない場合があります。たとえば、次のアサーション パス
int x = 6;
assert ++x == 7;
一方、これは失敗します
int x = 6;
assert x++ == 7;
と の両方が適用される変数をインクリメントしますが、 によって返される結果はvar++
インクリメント前の変数の値ですが、 によって返される結果はインクリメントが適用された後の変数の値です。++var
var++
++var
ループで使用する場合for
、変数のインクリメントはより大きなステートメントの一部を形成しないため、2 つの間に違いはありません。ソース ファイルの同じ行に他のコードがあるため、このように表示されない場合があります。しかし、よく見ると、;
インクリメントの直前に があり、その後に何もないことがわかります。そのため、インクリメント演算子はより大きなステートメントの一部を形成していません。
int a = 5, b;
ポストインクリメント: b = a++;
: a
は最初に に転送されb
、次にa
インクリメントされるため、現在b
は5
であり、a
です6
。b = a; a = a + 1;
pre increment ::b = ++a;
最初a
に がインクリメントされ、次に結果が に転送されるb
ため、今a
も7
もb
です7
。効果はa = a + 1; b = a
a++
独立して++a
滞在することも同様の方法で行動します。提示したループの例では、インクリメント演算子はどの式にも関連付けられておらず、独立しています。したがって、この特定の実装におけるこれら 2 つは同一です。
++var
プリインクリメント演算子です。式を評価するvar
前に値をインクリメントします。同様にvar++
、ポストインクリメント演算子です。式を評価したvar
後、値をインクリメントします。
++var;
単純なループの場合、式とvar++;
両方が同じ結果をもたらすため、2 つの間に違いはありません。
詳細については、たとえばhttp://www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Java/Chapter02/operators.html#IncDecOpsを参照してください。
var++ はインクリメントする前にその値を返します。
++var はインクリメント後にその値を返します。
int var = 0;
System.out.println(var++); // returns 0;
var = 0;
System.out.println(++var); // returns 1
あなたの例では、違いはありませんが、次の違いがあります。
int var = 0;
int var2 = ++var;
と:
int var = 0;
int var2 = var++;
最初のケースでは var2 の値は 1 ですが、2 番目のケースでは 0 です。
++var
とはどちらもvar++
式だけで現れる場合は同じです。これはあなたの質問に当てはまります++i
。i++
違いは、インライン化した場合にのみ発生します。
int x = 0;
printf( "%d %d\n", ++x, x ); // 1 1
printf( "%d %d\n", x++, x ); // 1 2
覚え方は?
最初に演算子が表示されたら、次にインクリメントし、後で値を取得します。
最初に変数が表示されたら、値を取得し、後でインクリメントします。
したがって、最初の例では、等しい値が表示されます。理由は次のとおりです。
you increment `x`, then access `x`, then access `x` again
したがって、2 番目の例では、次の理由で違いが見られます。
you access `x`, then increment `x`, then access `x` again
++i はプレインクリメントで、式に現れる前に実行されます。
i++ は後置デクリメントであり、表示される式の何かの後に実行されます。
最初のループでは、0 から 9 まで実行します。2 番目のループでは、1 から 9 まで実行します。
私のアドバイス: 両方を避けてください (例外は i++; または最初のループかもしれません)。式で探すにはトリッキーすぎます。
長い一日のデバッグを終えました
myArray[(i++)%16] = データ
そして、なぜデータに書き込もうとしたのかを見つけようとしています[16]。
実際、これはかなり単純です。プレインクリメント ++i は、ステートメントで最初に実行されます。
j = ++i +1;
と同等です
i = i+1;
j = i+1;
ポスト インクリメント i++ は最後に実行されます。
j = i++ +1;
と同等です
j = i+1;
i = i+1;