• ベストアンサー

論理演算

ビットの判定するために次のコードをしました。 if ( A And 2 = 2 ) or ( A And 4 = 4 ) Then ~ Aの論理積の結果が2か4ならばThen以下の処理の中に入っていってもらいたいのです。 ところが上記のコードでは演算式になってしまっているようで、 結果的にAが0以外ならば全てThenに入ってしまうザルコードになってしまいました。 散々つつきまわって以下のように( ) で括ればいいことが分かりました。 if (( A And 2 ) = 2 ) or (( A And 4 ) = 4 ) Then ~ ( )で括ればいいというのは分かりましたが、理由はさっぱり分かりません。 一番最初に書いたコードでも正常に見えるからです。 納得がいきませんので、どなたか説明よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.2

それは、式の中に違う種類の演算子があると それらの演算子は下記の順序で評価される決まりだからです。 1.算術演算子 2.比較演算子 3.論理演算子 ですから、    A And 2 = 2 は、   A And (2 = 2 ) と同じで、 先ず、2=2 が評価され(必ず「真」) 次に「その結果」とAが評価されので、 Aが「0以外」だと必ず「真」になる よって、    (A And 2) = 2 として、評価の順序を変えてやらなけえばいけないわけです。 以上です。

その他の回答 (2)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

次の計算をしなさい。 5×4+3 これは中学入試に出てくるような計算問題ですね。掛け算を先に やるか、足し算を先にやるかで結果が違いますが、小学6年生なら 出来るはずです。小学校で、「掛け算、割り算を先にやるんですよ。」 「順序を変えるには()で括りましょう。」と習いますね。これが、 数学のルールだからです。 >A And 2 = 2 これも、A And 2 を先にやるのか、2 = 2を先にやるのかで、結果が 違います。論理演算ですから「条件1 AND 条件2」という解釈が 先に来ます。条件1は"AND"の前にある式、即ち、「A」です。 条件2は"AND"の後ろにある式、即ち、「2 = 2」です。後者は必ず 真ですね。と言うことは「A」という条件だけに左右されます。 昔からのお約束で、「0でなければ真である」ということになります。 こういう解釈になるというのはルールなので、「5×4+3」と同じ ように憶えるしかありません。「何でだ?」と言われても、「それが プログラム(言語によって差異がある)のルールだから」としか 答えようがありません。 私の場合は「憶えるのが面倒くさい(ANDやORにも優先順がある)」、 「言語系により解釈が異なることがある」という理由で、必ず()を 付けるようにしています。

hawkwind
質問者

お礼

皆様ありがとうございます。 演算子の優先順位は勿論注意しておりますが、=が盲点になっていました。 固定観念が強くて、=まで発想が拡大できませんでした。

  • info22
  • ベストアンサー率55% (2225/4034)
回答No.1

多分 if ( A And (2 = 2) ) or ( A And (4= 4) ) Then ~ 「2=2」や「4=4」は T(true)なので ( A And (2 = 2) ) or ( A And (4= 4) ) =( A And T ) or ( A or T ) =( A ) or ( A ) =( A ) という論理演算をしていると考えれれます。

関連するQ&A

  • 論理演算子について

    論理演算に使う「or」なんですが、制御構文ifと組み合わせて以下のような使い方をしてみました。 $data01='aaa'; $data02='あああ'; $data03='test'; if ($data01 =~ m/aaa/ or $data02 =~ m/あああ/ or &data03 =~ m/test/){ 特定の処理; } このorによる論理演算ははどこまでできるのでしょうか? 上のスクリプトは問題なく動いていますが、ちょっと不安です。 専門書を見ても、orによる論理演算は<条件1 or 条件2>としか書いてなく <条件1 or 条件2 or 条件3 or ・・・>と書いても大丈夫なのでしょうか? いくつもの比較はorを使わないほうがよろしいとは思うんですが、このorが便利なのでこれで済むなら使いたいと思います。

  • 論理演算

    8桁の2進数10110111の最上位(最左端)のビットだけを0にするには、8桁の2進数01111111と、どのような論理演算を行えばよいか。 選択肢 (1)論理積 (2)論理和 (3)否定論理積 (4)否定論理和 という問題の答えと、なぜそうなるかを教えて下さる方いませんか。 よろしくお願いします。

  • 論理演算について質問

    int a=1,b=0,c=0のとき a==1 && b==0 || (a==1 && b==0) a==1 && b==0 &&c==0 && b==0 の2つの論理式あったとします 質問1:&&や||は、その間にある2つの関係式や2つの関係式の論理演算の結果同士などを論理演算するものだと思います。この認識で正しいですか? 質問2:上記の論理式の後者a==1 && b==0 &&c==0 && b==0について、trueになるプロセスの認識は以下で正しいですか? a==1 && b==0 はtrue       ↓  左から2番目の&&は、左の論理式(a==1 && b==0)の演算結果であるtrueと関係式c==0を論理演算(つまり、論理演算の結果trueと関係式の2つを演算)、、結果true ↓ 左から3番目の&&は、左の論理式(a==1 && b==0 &&c==0 )の演算結果であるtrueと右の関係式b==0を論理演算(つまり、論理演算の結果trueと関係式の2つを演算)、結果true 質問3:上記前者の論理式a==1 && b==0 || (a==1 && b==0)について、trueになるプロセスの認識は以下で正しいですか? (a==1 && b==0)はtrue      ↓ a==1 && b==0 はtrue      ↓ ||は、右の論理式((a==1 && b==0))の演算の結果trueと左の論理式(a==1 && b==0)の演算結果trueを計算し(つまり論理演算の結果同士であるtrue2つを演算)、結果true

    • ベストアンサー
    • Java
  • 論理演算について質問

    最初に、前回同じ質問に答えてくださった方へ、いろいろな人から僕の仮説のコンセンサスを得たいので、再度同じ質問しますね。 int a=1,b=0,c=0のとき a==1 && b==0 | (a==1 && b==0) a==1 && b==0 &&c==0 && b==0 の2つの論理式あったとします 質問1:&&や||は、その間にある2つの関係式や2つの関係式の論理演算の結果同士などを論理演算するものだと思います。この認識で正しいですか? 質問2:上記の論理式の後者a==1 && b==0 &&c==0 && b==0について、trueになるプロセスの認識は以下で正しいですか? a==1 && b==0 はtrue       ↓  左から2番目の&&は、左の論理式(a==1 && b==0)の演算結果であるtrueと関係式c==0を論理演算(つまり、論理演算の結果trueと関係式の2つを演算)、、結果true ↓ 左から3番目の&&は、左の論理式(a==1 && b==0 &&c==0 )の演算結果であるtrueと右の関係式b==0を論理演算(つまり、論理演算の結果trueと関係式の2つを演算)、結果true 質問3:前者の論理式、a==1 && b==0 | (a==1 && b==0)について、trueになるプロセスの認識は以下で正しいですか? (a==1 && b==0)はtrue      ↓ a==1 && b==0 はtrue      ↓ |は、右の論理式((a==1 && b==0))の演算の結果trueと左の論理式(a==1 && b==0)の演算結果trueを計算し(つまり論理演算の結果同士であるtrue2つを演算)、結果true

    • ベストアンサー
    • Java
  • 論理演算について

    次の表(真理値表と言う)と等価な論理演算(AND,OR,NOTで表現) を求めてください。    入力A 入力B 出力C     1   1    0     1   0    0     0   1    1     0   0    0 という問題なのですが、どのように答えたら(NOT、AND、ORで表現するってゆー意味がわからないんです)よいのかよくわからないのです。 今日提出課題なので急いでいます。 どなたか教えてください。よろしくお願いします。

  • 論理演算の問題です

    論理演算の問題です if( !( a > 0 && b == 0) ) は、 if( a <= 0 || b != 0 ) になりますか? また、 if( !( x > 0 || y < 0 ) は、 if( x <= 0 && y >= 0 ) になりますか? 遅い脳みそで考えました。 このような、論理演算を分かりやすくまとめられたサイトをご存知でしたら、 どなたか教えてください。 お願いします。

  • 論理演算子について

    論理演算子には Not And Or Xor Eqv Imp があるようですがNot・And・Orしか理解できませんでした。 Excel VBA ベーシックを受ける際は、上記しか理解してないままでも大丈夫ですか? しっかり勉強してすべて覚えるべきでしょうか?

  • 論理演算に関する質問です。

    論理演算に関する質問です。 以下の問題を解いてみたんですが正解なのか不正解なのか自信がないので教えてくれませんか? 論理関数 f(A,B,C,D)=_A_C_D+_AB_C+BCD+AB_C+A_BCD が与えられているとき積和形の最簡の論理式で表せ。 解き方ですがまずカルノー図を使って簡単化してみたところ f=_A_C_D+AB_C+BD+ACD という結果になってこれが最簡だと思うのですが当たっているでしょうか?

  • 論理演算について教えて下さい。

    基本的な論理演算について教えて下さい。 例えば、変数aにTrueを、変数bにNullを代入し、 a and b をした場合、Nullになるのは、わかるんですが、 a or b をした場合、なんでTrueになるんですか? 又、変数aにFalseを、変数bにNullを代入し、 a or b をした場合、Nullになるのは、わかるんですが、 a and b をした場合、なんでFalseになるんですか? お願いです。教えて下さい。。。 理由がわかりません。。。。

  • 論理演算について

    まず最初に。 (1)AND......論理積 (2)OR.........論理和 (3)XOR......排他論理和 (4)NOT......論理否定 (5)NAND...否定論理積?論理否定積? (6)NOR......否定論理和?論理否定和? (7)XNOR...否定排他論理和?排他論理否定和? コンピュータの一般に NAND、NOR、XNOR は NOT と組み合わせますから Windows 電卓などでも ボタンがありませんよね。でも、電子、電気関係ではゲート IC であります。 そこで質問です。 上記の(5)~(7)の場合は、なんと日本語で呼ぶべきか教えて頂きたいのです。 よろしくお願いします。

専門家に質問してみよう