Short cut: [Prev] [Up] [Next] [Return to Top]

Not True <> False (1996.Nov.10)

 さて。いきなりコード。

Function hex(s As String) As Integer
  hex = Instr("0123456789ABCDEF", s) '"s" must be char
End Function

   ....  '何かプログラムがある
If hex(ch) Then
   ....  'Then部
Else
  MsgBox "Not a Hex!" 'Else部
End If
   ....  '何かプログラムがある

 「Falseの値は0, 0以外はTrueとみなす」というVBの仕様を利用した小粋なプログラム……。
 だがちょっと待て。このコーディングには問題がある。

 変更する時にトラブルのだ。

1. Then部の処理が不要になった。
じゃぁってんで
  If Not hex(ch) Then MsgBox "Not a Hex!"
これがまともに動かなかったりする。

2. 書き方を変更しようとした。
  If hex(ch) = True Then
こいつも動かない。なお悪い事に
  If hex(ch) = False Then
はちゃんと動く。

3. 条件が追加になった。
  If hex(ch) And foo() Then
これが一番タチ悪い。何せ動いたり動かなかったりするのだ。

 理由はもう分かっていると思うが、VBのAnd, Or, Notとかは論理演算じゃなく、ビットの演算であるため。
 そりゃぁIf iFlag And 2 Then MsgBox "Bit1 = 1"という処理ができるためにはそうでないと困るんだが、上に書いたようなトラブルにはまると「見掛け上は 問題なし」なので恐らく非常にデバッグし辛いものとなる。

 従って:
True, Falseを後で判断する必要がある場合、その変数または関数は
True, False以外の値に「絶対に」ならないようにコーディングする。

 古いコードでそうなってないものがあれば、しつこいぐらいにコメントを入れておくこと!使っている所全てにコメント入れてもまだ足りないぐらいかな。

#「この関数がTrueを返す時のTrueはどれだっけ?」という訳の分からない事で悩むのはいやだと思うけどな

PS. どうしてもやりたければ、こんな感じで逃げる
Const ISOK = 0
Const ISERR = 1
Const ISABC = 2
 ...

If foo(x) = ISOK Then ...

曖昧な(ことがある)True/Falseでなく、自前で作った定数と比較する訳です


追記:VB 4.0になって変数にBOOL型が追加されましたね...本文は3.0e以下用です


Short cut: [Prev] [Up] [Next] [Return to Top]