Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

演算子の優先順位について

市販本に掲載されている演算子の優先順位について、分かる方がいらっしゃればお手数ですが教えてください。

int j=0;
boolean i;
i=2>1 && 0<++j;

市販本などでは演算子の優先順位を上記例だけ抜粋して示しますと
++ → <> → && → =
というように記載があり、これをこのまま考えると、
最初に++jが実施され、
i=2>1 && 0<1 となり、次に
2>1と0<1が判定され、
i=true && falseとなり、true && falseを判定し、
i=false になると思うのですが、

実際の動作では、&&の左辺を全て計算してから左辺がtrueなら、右辺の真偽を問うという処理を行います。
そうなると&&は一番最後の判断になるため、本などに載っている優先順位は
++ → <> → && → =
ではなく、
++ → <> → = → &&
になるのではないのでしょうか?
(こうなると++の最優先という位置付けも違って見えてきます)

本に載っているような優先順位、「++」「&&」の位置付けがその通りに処理される場合とはどういったときなのでしょうか?
分かる方がいらっしゃればご回答よろしくお願いいたします。

5

回答

89537

閲覧

5件の回答

評価

0

 0<1 はtrueでは?
最後は i = true && true で終わりそうですが。

評価

0

んん…?
実行順序は以下のとおりです。

2 > 1を判定(true)
jに+1
0 < 1を判定(true)
iに代入(true)

最初の判定式が 2 < 1であれば、そこで判定は終わって
右側は判定せず、jは変化しません。

その昔の言語には、両側を判定して&&するというものもありましたが、CやJavaではこういう動きです。
また、その昔の言語では++という単項演算子もなかったので、基本的に差異は生じません。

評価

0

mio様、スコットタイガー様

早速のご回答ありがとうございます。
提示例が間違っており大変失礼致しましたm(__)m

mio様に回答頂きました
iに代入(true)
が非常に参考になりました。


追加で質問させて頂いてよろしいでしょうか?

「&&左辺」がfalseになった場合、j:1にならず処理が終了しますが、「&&右辺」の++jが演算子の優先順位からして先に計算されるはずなのに「&&」の左辺が先に計算されます。これが仕様だから仕方が無いのはわかるのですが、そうであれば市販本などでは、なぜ「&&」を「++」より高い優先順位として掲載していないのでしょうか?

お分かりの方がいらっしゃればご回答よろしくお願いいたします。

評価

0

++の有効範囲を、誤解しているからです。
++は、あくまでその対象の変数(式)にだけ有効なものであって、
複合条件式全体に有効なものではないからです。
++が&&の左にある場合は、++が先に働きます。

評価

0

mio様

ありがとうございます。お蔭様で演算子の優先順位についてすっきりしました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。