(潜在的に奇妙な)長い増分動作?

私はこの質問をするのに少し恥ずかしいですが、次のコードスニペットの結果は私を困惑させました:

System.out.println("incrementResultResponses() has been invoked!");
final long oldValue = resultResponses;
final long newValue = resultResponses++;
System.out.println("Old value = " + oldValue);
System.out.println("New value = " + newValue);

これは次を出力します:

incrementResultResponses() has been invoked!
Old value = 0
New value = 0

どうして?同時実行性は結果に影響を与えますか?ところで、 resultResponses long です。

4
@マット、はい、私のせいです。可能であれば、私は他人にこの質問を重複して投票させたいと思います。
追加された 著者 mre,
Javaでのインクリメント演算子の不思議な動作おそらく最高のdupではありませんが、文字通り何百もあります。 "[java] post-increment"を検索してください。
追加された 著者 Mat,

4 答え

接尾辞 ++ 演算子は、(増分する前に)古い値を返します。接頭辞 ++ を使用する場合:

final long oldValue = resultResponses;
final long newValue = ++resultResponses;
9
追加された
なぜバマー?これはpostfixと接頭辞 ++ がどのように定義されているかです:postfixは変数をインクリメントし、古い値を返します。なぜなら接頭辞は変数をインクリメントして新しい値を返します。後者が必要な場合は、postfix ++ の代わりにprefixを使用します。
追加された 著者 Jesper,
それは酷いことだ。何らかの理由で、私はpostfix演算子を変数に代入すると、演算が強制的に新しい値を返すと考えました。 :/
追加された 著者 mre,
私の理解が間違っていたので、それはバカだ! :/
追加された 著者 mre,

Because the increment increases the value after it was assigned (Post-Increment). That's exactly what resultResponses++ is supposed to do.
If you want resultResponses to be 1, you need to use Pre-Increment, which is ++resultResponses

3
追加された

代入の前にoldValueをインクリメントしたい場合は、変数の前に ++ を配置する必要があります:

final long newValue = ++resultResponses;

つまり、インクリメントは、ステートメントが実行される前に実行される前に行われます。

2
追加された

this を参照して、 postfix プレフィックスが動作します。 上の答えで述べたように、あなたはこれを使うことができます:

final long oldValue = resultResponses;
final long newValue = ++resultResponses;

または、それをさらに魅力的にするには、次のものを使用することもできます。

final long oldValue = resultResponses++;
final long newValue = resultResponses;

同じ出力が得られます。

1
追加された