2017-02-23 78 views
1

在具有多個條件的IF聲明中遇到了一個奇怪的問題。 最後一個工作版本是這樣的:VB6多重IF聲明離奇問題

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,所以所有位你應該檢查Instr的結果是否大於0.這將返回0或-1,你的表達式會更加正確 –

+0

我看到了這個,但是在這種情況下,vb6將任何值大於0的值隱式轉換爲真 –

回答

2

沒有冒犯,但這只是太難以解析,並沒有很好的理由。在處理And條件時,使用嵌套的If s要好得多,最可能的條件首先放置,最昂貴的測試放在可能的地方。這是更清晰,幾乎肯定更快:

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

這允許短路,否則在VB6中不可用。代碼不會因爲它在一行上而運行得更快。

兩個變化:測試If Instr > 0而不僅僅是If Instr。是的,VB將評估一個成功的測試,以True/False將永遠不會計算表達式的NotFalse,它總有一天會咬你。相信它。 ( - :

改變二:我用括號來強制改變優先順序爲Or條件有規定,但是當你最不期望它你可以得到類似If VAR3 = (1 Or VAR3) = 15要明確,沒有驚喜

+0

檢查> 0也是更好的'防禦'編程。由於它更明確,一些未來的程序員不太可能做出改變,從而破壞它。 – DaveInCaz

+0

我在簡化,但這只是規則列表中許多條件中的一個。真正的功能有很多elseif,如果我把一個條件放在另一個條件下,代碼會混亂... 第一次更改:我已經把> 0 ... = D 第二次更改:不理解'如果VAR3 =(1或VAR3)= 15'的條件。爲什麼你把那些東西放進去? 謝謝! –

+0

@FernandoMoreno - 如果您對優先級規則的理解與編譯器不同,那麼這只是您可能遇到的那種問題的一個例子。在代碼塊中查看我的實際建議。要明確:在可能會出現混淆的情況下,增加parens來強制評估 - 它從不會傷害, –