プロが教える店舗&オフィスのセキュリティ対策術

以下のようなコードを書きました。

If a = 0 Or 6 Then
  msgbox a
Else
  msgbox "a"
End If

期待しているのは、変数aの値が0か6のときにだけ変数aを表示するというものです。
しかし実際にはたとえばaの値が2のときでも変数aが表示されてしまいます。
ひょっとしてOrの使い方を間違っているのでしょうか?
よろしくお願いします。

A 回答 (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になってしまいます。
    • good
    • 0
この回答へのお礼

思い出しました!
CInt(True)
とすると結果は-1になるんですね!

本当に助かりました。どうもありがとうございました!

お礼日時:2005/11/15 14:04

> 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節を実行される。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/11/15 13:11

かなり派手に間違っていますね^^;



正しい書き方は#1の方の通りですが、
0 or 6 では単純な計算式ですから 6 となります。

すると 上記のコードは if a = 6 then と同じことになり・・・

ちょっとおかしいですよね。

a = 6と同じなら a が6のときしかifの中に入らないはず!?

実は上記の使い方は二重に論理ミスを犯していまして、
かなりおかしなことになっています。

a = 0 or 6 が実は定数 -1 になってしまっています。
で上記のコードは if -1 then と同じになっています。

この回答への補足

回答ありがとうございます。
かなり派手に間違ってしまいました。

ところで、
>a=0 or 6が実は定数-1になってしまいます。
というのはどうしてなのでしょうか?もうちょっと教えてもらえないでしょうか?

補足日時:2005/11/15 11:10
    • good
    • 0

> 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だけでなく、条件式の中身も画面上に出すと分かります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/11/15 11:15

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)
をやってみるとわかりますよ。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/11/15 11:15

正解は#1の方の書き方で良いと思います。



要は以下のように書いた時、
 If [評価式A] Or [評価式B] Then
  処理X
 ELSE
  処理Y
 END IF
評価式Aが真 または 評価式Bが真 の時に処理Xが行われます。

質問者さんのような書き方をしてしまうと
a=0が偽と判定されてもBの評価式が「6」としか書いてないので常に真となってしまいます。
※真偽の判断は内部的には 偽が0、真はそれ以外 というようになってます。
 その為、0以外の数値などは真と判定されます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/11/15 11:16

わたしはVBAしか知りませんが、VBAならこうです。



Sub test()
a = 2
If a = 0 Or a = 6 Then
MsgBox a
Else
MsgBox "a"
End If
End Sub
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/11/15 11:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A