- ベストアンサー
論理演算についての質問
- 論理演算子について説明します。
- 評価と論理演算の違いについて解説します。
- 括弧の中の論理式の演算順序について説明します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
質問1は何を聞いているのかよく分からないけど、 || は2つのオペランドを取ることができる演算子(論理演算子)で その例だと||の第1オペランドは a==1 && b==3 第2オペランドは a==1 && b==0 > 質問2:「評価」と「論理演算」って意味は同じですか?違いますか?違うならその違いは? 評価の方が広い意味。 評価は式から値を求めること。 式に代入やメソッド呼び出しが含まれている場合は、評価によって副作用(変数の値が変化すること)が生じることもある。 > だって()の中の論理式なんだから、優先的に演算されるはず。 優先されるのは結合順であって、評価順序ではないです。 例えば質問1の式にかっこを追加して、 a==1 && (b==3 || a==1) && b==0 とすると ||の第1オペランドは b==3 第2オペランドは a==1 に変わります。 それに対して、 a==1 && b==0 || (a==1 && b==0) では ||の第1オペランドは a==1 && b==3 第2オペランドは (a==1 && b==0) なので、質問1の式から何ら変わっていません。(等価な式です。) 評価順序について言えば、例えば、 a*b + c*d では、 + の2つのオペランドa*bとc*dのどちらを先に評価してもかまわない訳です。 (どうせ両方の評価が終わった後でないと足し算できない。) || や && はやや特殊でショートサーキット動作をするので、 第1オペランドを先に評価すると決められています。
その他の回答 (2)
- jjon-com
- ベストアンサー率61% (1599/2592)
> だって()の中の論理式なんだから、優先的に演算されるはず。 ANo.1とまったく同じく「優先されるのは結合順であって、評価順序ではない」が回答です。 a==1 && b==0 || a==1 && b==0 という括弧のない論理式において暗示されている2項同士の結合関係を,あえて明示すると次のようになり, ((a==1 && b==0) || (a==1 && b==0)) …ア その評価順を[1][2][3]で示すと次のようになります。 [3]( [1](a==1 && b==0) || [2](a==1 && b==0)) …イ 質問者は,括弧を付けることで イの評価順を変えることができると勘違いしているけれど,括弧で変えることができるのは アの結合関係だけです。イの評価順を変えたければ,Javaの場合は2項の左右の配置を替えることになります。 実証コードはこちら。 class Q6818236 { public static void main(String[] args) { int a = 1; int b = 0; if (a==1 && b==0 || (++a==2 && ++b==1)) { //何もしない } System.out.println("a=" + a + " b=" + b); } }
お礼
丁重なご回答ありがとうございます! そしてお礼遅れてしまい申し訳ありません。。 評価順序は変えられないんですね! ありがとうございます!
- hitomura
- ベストアンサー率48% (325/664)
質問1 演算の対象としてはそのとおりです。……が、(以下、質問3の回答へ) 質問2 「評価」は「論理演算」を含みますが、それだけではありません。その値を求めるのに必要な処理を含みます。 たとえば、 class A { static boolean func(){return true;} public static void main(String[] args) { boolean a; a = func() && true; } } という場合、&&の計算の際、その左右とも論理演算(&&, ||, !など)を行っていません。しかし、その値がいくつか求めるということを行っています(左辺:func()を実行し、その結果trueを得る、右辺:booleanのリテラルであるtrueを得る)。 質問3 演算子が||でなかったら http://www.y-adagio.com/public/standards/tr_javalang/15.doc.htm#18740 に書いてあるとおり、その仮説は正しいです。 でも、その部分にわざわざ > (条件演算子&&, ||,そして? :を除く) と書いてあるとおり、&&と||は特別な処理を行います。 http://www.y-adagio.com/public/standards/tr_javalang/15.doc.htm#5247 にまとめて書いてありますが、まとめると「まず左辺を評価し、その結果右辺の評価が必要ならば右辺を評価する。右辺を評価するまでもなく値が求まるのならば右辺を評価しない」という動きをします。
お礼
丁重なご回答ありがとうございます! そしてお礼遅れてしまい申し訳ありません。。 わざわざコードまでありがとうございます!
お礼
丁重なご回答ありがとうございます! そしてお礼遅れてしまい申し訳ありません。。 かなりのきずきを得られました!