避免完全检查if语句

时间:2015-05-29 19:05:52

标签: delphi

下面的代码示例应该评估一个字符串。

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] > ' ')将创建一个Access违规。 我可以在保持if条件的同时避免此问题吗?

1 个答案:

答案 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 .....