避免if语句的完整检查
问题描述:
下面的代码示例应评估一个字符串。避免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
条件的情况下避免此问题吗?
答
您需要将{$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 .....
您是否启用了完整的布尔评估? –
大卫的意思是,如果完全布尔评估是* not * enabled(这是默认值),那么您将不会得到访问冲突,因为如果'L = 0',测试'(L> 0)''将已经失败,并使代码跳过评估的其余部分。 –