端的に言うと、答えは「s は 20 で、t は特定できない」です。s が 20 という部分はわかるのですが、なぜ t が決まらないのでしょうか? 私を助けてください!
2 に答える
int s = 20;
int t = s++ + --s;
作業: インクリメント (ポスト インクリメント) を 21 (現在の値 20) + デクリメント (プリ デクリメント) を 20 (現在の値 20) にします。
So, t=20+20;
And s =20;
優先順位と括弧を考慮した後、Java は式が左から右に評価されることを保証します。たとえば、eat() + drink() - beMerry() を評価する場合、Java はまず eat() を評価し、次に Drink() を評価し、次に加算を実行し、次に beMerry() を評価し、最後に減算を実行します。eat() は Drink() の前に評価されます。これは、eat() が Drink() の左側にあり、式が左から右に評価されるためです。この保証は重要です。なぜなら、eat() と drink() の呼び出しには、逆の順序で呼び出された場合とは異なる副作用がある可能性があるためです。
これを読んでください:
インクリメント/デクリメント演算子はそのオペランドを変更するため、同じ式内でこのようなオペランドを複数回使用すると、未定義の結果が生じる可能性があります。たとえば、x − ++x などの式では、減算演算子とインクリメント演算子をどの順序で実行する必要があるかが明確ではありません。このような状況は、コンパイラーによって最適化が適用されるとさらに悪化し、プログラマーが意図したものとは異なる操作の実行順序になる可能性があります。
さて、あなたの答えはかなり明確なはずです。t の値は、コンパイラ/最適化によって異なる場合があるように思えます。
ここにいくつかの詳細情報があります: http://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#Sequence-Points-Constrain-Expressions