2017-02-23 12 views
1

IFステートメントで複数の条件で奇妙な問題が発生しました。VB6 multiple IF statement奇妙な問題

If VAR1 = "SCRT" And InStr("|TEC|FIN|", "|" & VAR2 & "|")) And VAR3 = 1 Then 

そして今、私は声明に別の条件を実装する:この値では

If VAR1 = "SCRT" And InStr("|TEC|FIN|", "|" & VAR2 & "|")) And (VAR3 = 1 or VAR3 = 15) Then 

を: VAR1: ""(空の) VAR2: "FIN" 最後の作業バージョンは次のようになります VAR3:1

デバッグ時に問題なく動作するコードです。奇妙なことがコンパイルされ、実稼働環境で実行されているが、最初の条件が正常でなくても条件が満たされている。

すでにチェックする値を記録しています。 運用環境には同じファイル(ライブラリ)があります。

条件のほかに変更されたのは、このモジュールの最初のOption Explicitです。

ありがとうございます!

+0

'On Error Resume Next'と' VAR1'はヌルですか? – wqw

+2

Instrは一致の位置を返します(1または5または0のいずれか).And演算子はVB6でビット単位で、TRUEの値は-1です。 –

+0

私はこれを見ましたが、この場合、vb6は0より大きい値を暗黙的に0に変換します。 –

答えて

2

嫌なことはありませんが、それは構文解析するのが難しく、正当な理由もありません。 Andの条件を扱うときは、ネストされたIfを使ってはるかに良いでしょう。

If VAR1 = "SCRT" Then 
If InStr("|TEC|FIN|", "|" & VAR2 & "|")) > 0 Then 
    If (VAR3 = 1) or (VAR3 = 15) Then 

これにより、短絡が可能になります。それ以外の場合はVB6では使用できません。コードが1行にあるという理由だけで、コードはより速く実行されません。

2つの変更がテストIf Instr > 0ではなく、If Instrです。はい、VBはTrue/Falseに成功したテストを評価しますが、という表現のNotは決して評価されません。これはいつかあなたに噛まれます。それを信じる。 ( - :

第二の変化:私はルールがありますOr条件の優先順位を強制するために括弧を使用していますが、少なくともそれを期待するときにIf VAR3 = (1 Or VAR3) = 15のようなものを得ることができ、明示的うと何の驚きがない

。。。
+0

> 0をチェックすることも、より優れた「防御的」なプログラミングです。より明示的であるため、将来のプログラマーの中には、それを壊す変更を加える可能性は低いです。 – DaveInCaz

+0

私は単純化していましたが、これはルールリストの多くの条件の1つに過ぎません。実際の関数は多くのelseifを持っていて、ある条件を別の条件に入れると、コードは乱雑になります... 最初の変更:すでに> 0を入れています... = D 2番目の変更:「VAR3 =(1またはVAR3)= 15」の条件を理解できませんでした。なぜあなたはそのような括れを置くのですか? ありがとうございました! –

+0

@FernandoMoreno - これは、優先順位のルールについての理解がコンパイラのものと同じでない場合に発生する可能性のある問題の例です。私の実際の勧告については、コードブロックを見てください。混乱の可能性があるときに評価を強制するために括弧を追加する - それは決して痛くない、 –