プログラミング、特にJavaでは、次の違いは何ですか?
int var = 0;
var++;
そして
int var = 0;
++var;
これはforループにどのような影響を与えますか?
例えば.
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つの間に違いはありません。ソースファイルの同じ行に他のコードがあるため、このように表示されない場合があります。ただし、よく見ると、インクリメントの直前に_;
_があり、その後に何もないので、インクリメント演算子は大きなステートメントの一部を形成しません。
++var
は事前インクリメント演算子です。 var
の値をインクリメントしてから、式を評価する前になります。同様に、var++
はポストインクリメント演算子です。式を評価するvar
afterの値をインクリメントします。
単純なループの場合、式++var;
およびvar++;
両方とも同じ結果になります。
詳細については、たとえば http://www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Java/Chapter02/operators.html#IncDecOps を参照してください。
int a = 5, b;
ポストインクリメント:b = a++;
:a
は最初にb
に転送され、次にa
が増分されるため、b
は5
、およびa
は6
効果はb = a; a = a + 1;
事前インクリメント:b = ++a;
:最初にa
がインクリメントされ、次に結果がb
に転送されるため、a
は7
またb
は7
。効果はa = a + 1; b = a
a++
および++a
独立したままで、同様の方法で行動します。ループの例では、インクリメント演算子はどの式にも関連付けられておらず、独立しています。したがって、この特定の実装のこれら2つは同一です。
あなたの例では、違いはありませんが、以下の違いがあります:
int var = 0;
int var2 = ++var;
そして:
int var = 0;
int var2 = var++;
前者の場合、var2の値は1ですが、後者の場合は0です。
var ++は、インクリメントする前にその値を返します。
++ varは、インクリメント後に値を返します。
int var = 0;
System.out.println(var++); // returns 0;
var = 0;
System.out.println(++var); // returns 1
両方 ++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;