104

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) {}
4

8 に答える 8

156

tldr;

と の両方が適用される変数をインクリメントしますが、 によって返される結果はvar++インクリメント前の変数の値ですが、 によって返される結果はインクリメントが適用された後の変数の値です。++varvar++++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++インクリメント前の変数の値ですが、 によって返される結果はインクリメントが適用された後の変数の値です。++varvar++++var

ループで使用する場合for、変数のインクリメントはより大きなステートメントの一部を形成しないため、2 つの間に違いはありません。ソース ファイルの同じ行に他のコードがあるため、このように表示されない場合があります。しかし、よく見ると、;インクリメントの直前に があり、その後に何もないことがわかります。そのため、インクリメント演算子はより大きなステートメントの一部を形成していません。

于 2011-05-30T10:53:16.777 に答える
18

int a = 5, b;

ポストインクリメント: b = a++;: aは最初に に転送されb、次にaインクリメントされるため、現在b5であり、aです6b = a; a = a + 1;

pre increment ::b = ++a;最初aに がインクリメントされ、次に結果が に転送されるbため、今a7bです7。効果はa = a + 1; b = a

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

于 2011-05-30T10:55:11.587 に答える
15

++varプリインクリメント演算子です。式を評価するvar に値をインクリメントします。同様にvar++、ポストインクリメント演算子です。式を評価したvar 、値をインクリメントします。

++var;単純なループの場合、式とvar++;両方が同じ結果をもたらすため、2 つの間に違いはありません。

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

于 2011-05-30T10:58:04.737 に答える
10

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

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

var = 0;
System.out.println(++var); // returns 1
于 2011-05-30T10:57:37.087 に答える
7

あなたの例では、違いはありませんが、次の違いがあります。

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

と:

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

最初のケースでは var2 の値は 1 ですが、2 番目のケースでは 0 です。

于 2011-05-30T10:54:26.650 に答える
1

++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
于 2018-01-20T15:08:03.010 に答える
0

++i はプレインクリメントで、式に現れる前に実行されます。

i++ は後置デクリメントであり、表示される式の何かの後に実行されます。

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

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

長い一日のデバッグを終えました

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

そして、なぜデータに書き込もうとしたのかを見つけようとしています[16]。

于 2011-05-30T10:55:17.120 に答える
0

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

j = ++i +1;

と同等です

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

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

j = i++ +1;

と同等です

j = i+1;
i = i+1;
于 2011-05-30T10:57:50.883 に答える