質問: i++)は、 インクリメントする前に演算が評価され、 そのあとにインクリメントされる想定でいました。 例2)のプログラムでは どういった動きをするのかご教授お願いします。
回答: Javaの場合限定、という前置きで。 Javaにおける前置インクリメント(++a)、後置インクリメント(a++)はどちらも**式**です。 厳密には前者は単項演算子の式、後者は後置式と呼ばれます。 式というものは、**評価**されて**値**を返します。変数の中身そのものではなく、我々には何等かの評価を行った後の値が見えます。 とっても古いですがJava言語規定というドキュメントがございまして、ここからそれぞれの式の仕様を引用します。 前置インクリメント演算子++では、 > > 値1が変数の値に加えられ,合計は変数に格納される。 > > 前置インクリメント式の値は,新しい値が格納された後の変数の値である。 > > > とあります。 対して後置インクリメント演算子++では、 > > 値1が変数の値に加えられ,合計は変数に格納される。 > > 後置インクリメント式の値は,新しい値が格納される前の変数の値である。 > > > と書かれています。 どちらも式を評価し、変数の中身が書き換わった後、評価結果として値を返しますが、前置のほうは新しく書き換わる前の値を返し、後置の場合は書き換わった後の値を返すという違いになります。 また、演算中における式は、カッコなどによる特別に順序の指定がなければ左から右へ順に評価されていきます。 なので、`boolean bo = (i++ == i++);`がどのように評価されるかというと、まずカッコの中身が優先なので`(i++ == i++)`が先に評価される。 わかりやすいように逆ポーランド記法風に書くと、`i++ i++ ==` で、左から順に評価されていきます。 まず最初の`i++`が評価されます。元のiは10なので、まず変数が演算されiが11になり、式の評価結果としては変数変更前の10が返ります。 次に、真ん中の`i++`が評価されます。iの中身は11になっているので、変数が演算されると12になり、式の評価結果としては変更変更前の11が返ります。 最後に`==`演算子が評価されます。2項演算子なので直前2つの値が一致するか評価されます。直前2つの値は式の評価後、`10 11`となっているので一致せずfalseが返るというわけです。 このように、 * 式とは何なのか * 評価と値の関係 * 各式の評価順序 を踏まえ、この件は未定義でも不定でもなく、規定の動作ということになります。 インクリメントの動作は行単位ではないのですよ! なお、以下のサンプルプログラムで、インクリメント式の値がどんな値を返すのか、可視化できます。 実行してみてください。 ``` public static void main(String []args){ int a,b; a = 10; b = add(a++ , a++); System.out.println("a=" + a); System.out.println("b=" + b); } public static int add(int i1, int i2){ System.out.println("i1=" + i1); System.out.println("i2=" + i2); return i1 + i2; } /* 実行結果 i1=10 i2=11 a=12 b=21 */ ```