2015-05-29 113 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 .....