• ベストアンサー

VB6,論理演算子Orの使い方がわからない

以下のようなコードを書きました。 If a = 0 Or 6 Then   msgbox a Else   msgbox "a" End If 期待しているのは、変数aの値が0か6のときにだけ変数aを表示するというものです。 しかし実際にはたとえばaの値が2のときでも変数aが表示されてしまいます。 ひょっとしてOrの使い方を間違っているのでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • hawkwind
  • ベストアンサー率34% (160/469)
回答No.7

>a=0 or 6が実は定数-1になってしまいます。 >というのはどうしてなのでしょうか a = 0 or 6 と普通にaに代入すると これはビット演算ですから a に6が入ります。 しかし、if文の中では a=0 と 6 の論理演算になります。 演算子の優先順序など、詳しいことは#6の方の説明の中にあります。 そして (( a = 0 ) or 6 ) の評価が-1(True)となります。 上記でも分かると思いますが、6が単独で残ってしまうのが問題で、 必ずTrueになってしまいます。

tochanx
質問者

お礼

思い出しました! CInt(True) とすると結果は-1になるんですね! 本当に助かりました。どうもありがとうございました!

その他の回答 (6)

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.6

> 0 or 6 では単純な計算式ですから 6 となります。 Or演算子は論理和ではなくbit和で計算されます。 00000000と00000110のbit和で00000110 一方、=演算子はbool値を帰します。 また、演算子には優先順位があって、= の方が Or より強い。 > If a = 0 Or 6 Then は ((a = 0) Or 6) が評価され aが0の場合は (a=0)の値はTrue 2進で書くと 1111111111111111 Or 0000000000000110 でbit和は 1111111111111111 つまり if True then aが0以外は (a=0)の値はFalse 2進で書くと 0000000000000000 Or 0000000000000110 でbit和は 0000000000000110 つまり if 6 then if文は0以外はthen節を実行される。

tochanx
質問者

お礼

とてもとても勉強になりました!どうもありがとうございました!

  • hawkwind
  • ベストアンサー率34% (160/469)
回答No.5

かなり派手に間違っていますね^^; 正しい書き方は#1の方の通りですが、 0 or 6 では単純な計算式ですから 6 となります。 すると 上記のコードは if a = 6 then と同じことになり・・・ ちょっとおかしいですよね。 a = 6と同じなら a が6のときしかifの中に入らないはず!? 実は上記の使い方は二重に論理ミスを犯していまして、 かなりおかしなことになっています。 a = 0 or 6 が実は定数 -1 になってしまっています。 で上記のコードは if -1 then と同じになっています。

tochanx
質問者

補足

回答ありがとうございます。 かなり派手に間違ってしまいました。 ところで、 >a=0 or 6が実は定数-1になってしまいます。 というのはどうしてなのでしょうか?もうちょっと教えてもらえないでしょうか?

  • 2531kbps
  • ベストアンサー率13% (183/1333)
回答No.4

> If a = 0 Or 6 Then の6というのは、常に6なのでそのif条件には必ず合格(?)します。 正しくは、 If a = 0 Or a = 6 Then 私なら If (a = 0) Or (a = 6) Then としますね。 a = (0 Or 6) というのも無理なんじゃないかなあ。 まあ、VB6にもデバッガがあるので、ifステートメントの条件式の値をウォッチするとよいでしょう。 プリントさせるなら、aだけでなく、条件式の中身も画面上に出すと分かります。

tochanx
質問者

お礼

ありがとうございます。 納得できました。 0 or 6が6になるというのは、 00000000 00000110 をorすると6になるからTrueになる、ということであってるでしょうか?

回答No.3

No1の方の回答どおり、ここはVBAもVB6も同じです。 If (a=0) or (a=6) Then  msgbox a Else  msgbox "a" End If で、 If a=0 or 6 Then は、6はbool値でTrueですから必ずTRUE側に落ちます。 msgbox cbool(6) をやってみるとわかりますよ。

tochanx
質問者

お礼

cboolを使って理解が深められました。 どうもありがとうございました。

  • asahina02
  • ベストアンサー率47% (95/202)
回答No.2

正解は#1の方の書き方で良いと思います。 要は以下のように書いた時、  If [評価式A] Or [評価式B] Then   処理X  ELSE   処理Y  END IF 評価式Aが真 または 評価式Bが真 の時に処理Xが行われます。 質問者さんのような書き方をしてしまうと a=0が偽と判定されてもBの評価式が「6」としか書いてないので常に真となってしまいます。 ※真偽の判断は内部的には 偽が0、真はそれ以外 というようになってます。  その為、0以外の数値などは真と判定されます。

tochanx
質問者

お礼

とてもわかりやすかったです。 納得できました。ありがとうございました。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.1

わたしはVBAしか知りませんが、VBAならこうです。 Sub test() a = 2 If a = 0 Or a = 6 Then MsgBox a Else MsgBox "a" End If End Sub

tochanx
質問者

お礼

なるほど、a=をもうひとつ書かなきゃいけなかったんですね。 どうもありがとうございました。