web-dev-qa-db-ja.com

++ VarとVar ++の違い

プログラミング、特にJavaでは、次の違いは何ですか?

int var = 0;
var++;

そして

int var = 0;
++var;

これはforループにどのような影響を与えますか?

例えば.

for (int i = 0; i < 10; i++) {}

for (int i = 0; i < 10; ++i) {}
72
user559142

tldr;

_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つの間に違いはありません。ソースファイルの同じ行に他のコードがあるため、このように表示されない場合があります。ただし、よく見ると、インクリメントの直前に_;_があり、その後に何もないので、インクリメント演算子は大きなステートメントの一部を形成しません。

118
Dónal

++varは事前インクリメント演算子です。 varの値をインクリメントしてから、式を評価する前になります。同様に、var++はポストインクリメント演算子です。式を評価するvarafterの値をインクリメントします。

単純なループの場合、式++var;およびvar++;両方とも同じ結果になります。

詳細については、たとえば http://www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Java/Chapter02/operators.html#IncDecOps を参照してください。

13
Eser Aygün

int a = 5, b;

ポストインクリメントb = a++;aは最初にbに転送され、次にaが増分されるため、b5、およびa6効果はb = a; a = a + 1;

事前インクリメントb = ++a;:最初にaがインクリメントされ、次に結果がbに転送されるため、a7またb7。効果はa = a + 1; b = a

a++および++a独立したままで、同様の方法で行動します。ループの例では、インクリメント演算子はどの式にも関連付けられておらず、独立しています。したがって、この特定の実装のこれら2つは同一です。

11
phoxis

あなたの例では、違いはありませんが、以下の違いがあります:

int var = 0;
int var2 = ++var;

そして:

int var = 0;
int var2 = var++;

前者の場合、var2の値は1ですが、後者の場合は0です。

6
Maurice Perry

var ++は、インクリメントする前にその値を返します。
++ varは、インクリメント後に値を返します。

int var = 0;
System.out.println(var++); // returns 0;

var = 0;
System.out.println(++var); // returns 1
6

両方 ++varおよびvar++は、式のみに現れる場合は同一です。これはあなただけの++ii++

これらの違いは、インライン化した場合にのみ発生します。

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
0
Eugen Konkov

++ iはプリインクリメントであり、式に現れる前に行われます。

i ++はポストデクリメントであり、式の中で何かが現れた後に行われます。

最初のループでは、0から9まで実行されます。2番目のループでは、1から9まで実行されます。

私のアドバイス:両方を避けてください(例外はi ++かもしれません;または最初のループ)。式で探すのは面倒です。

長い一日のデバッグに合格しました

myArray [(i ++)%16] =データ

なぜデータに書き込もうとしたのかを調べようとする[16]

0
SJuan76

実際、これはかなり単純です。プリインクリメント++ iは、ステートメントの最初に実行されます。

j = ++i +1;

に等しい

i = i+1;
j = i+1;

一方、ポストインクリメントi ++は最後に実行されます。

j = i++ +1;

に等しい

j = i+1;
i = i+1;
0
Eilistraee