質問: 2; System.out.println(i * i + ++i); ``` 実行結果 7 上記の実行結果になる理由を教えてください。 「i * i」が評価されて「4」に置き換わり、そのあと「++i」が評価されて「3」に置き換わったから(この時点で「4 + 3」)でしょうか? 「i * i」のふたつの「i」が評価されて「2」に置き換わり、そのあと「++i」が評価されて「3」に置き換わったから(この時点で「2 * 2 + 3」)でしょうか? あるいは、ほかの理由があるのでしょうか?
回答: 仕様は > > 「i * i」が評価されて「4」に置き換わり、そのあと「++i」が評価されて「3」に置き換わったから(この時点で「4 + 3」) > > > ということになります。 厳密な仕様は言語仕様の15.7(java10)に書いてあります。 大雑把に言えば * 概ね左から右 * 演算子の計算順序は優先順位によって決まる * 演算子の左側のオペランドが先に評価される よって`a*b+c`の場合、cよりも「a、bおよびa*bが先に計算される」と決まっています。 ・・・が、言語仕様に「計算順序に依存しないようなコードの方がよくて、特に副作用は多くても一つの式で一か所だけの方がよい」とあるように、あまりこの仕様に左右されないような書き方を心がけるのが一番よいと思います。 追記:用語を用いてしゃべるとどうしても意志が伝わっているかどうかわからなくなります。自分が日本語下手なせいなのだと思います。そこで自分が頭の中にイメージしていることを図で表現してみました。 `a + b + c * d` 最初に優先度により次のようにグルーピングされる(グルーピングしなくてもいいけど、とりあえずしてみます) `a + b + (c * d)` 次に演算子+が左結合なのと、左オペランドが先に評価されることを整理すると ``` a b + (c * d) + ``` こういうイメージになる。上の方が先に評価すべきもの。 で、グルーピングした乗算式も左オペランド優先の規則に従って書けば括弧を記述する必要がなくなり ``` a . b + . c . . d . * . . + ``` a + b + ++ cも同様にすると ``` a + b + (++c) ==> a . b + . c . ++ . . . + ``` こんなふうに捉えています。