2015-05-29 157 views
0

下面的代碼示例應評估一個字符串。避免if語句的完整檢查

function EvaluateString(const S: Ansistring): Ansistring; 
var 
    i, L: Integer; 
begin 
    L := Length(S); 
    i:=1; 
    if (L > 0) and (S[i] > ' ') and (S[L] > ' ') then 
    ..... 


end; 

但如果L = 0,那麼(S[i] > ' ')將創建訪問衝突。 我可以在保持if條件的情況下避免此問題嗎?

+0

您是否啓用了完整的布爾評估? –

+0

大衛的意思是,如果完全布爾評估是* not * enabled(這是默認值),那麼您將不會得到訪問衝突,因爲如果'L = 0',測試'(L> 0)''將已經失敗,並使代碼跳過評估的其餘部分。 –

回答

10

您需要將{$B-}聲明置於代碼之上,或者在項目設置中啓用boolean short circuit evaluation

由於{$B-}是默認設置,因此您可能以前已經打開它,或者有一個{$B+}指令將其關閉。

短路評價模式{$B-},Delphi的創建代碼,(大致),相當於此:

if (L > 0) then begin 
    if (S[i] > ' ') then begin   
     if (S[L] > ' ') then begin  
      ..... 
     end; 
    end; 
end; 

相反,用充分佈爾評價模式{$B+},等效可能是一些像這樣:

var a,b,c : Boolean; 

a := (L > 0); 
b := (S[i] > ' '); // always executed 
c := (S[L] > ' '); // always executed 

if a and b and c then .....