下面的代码示例应该评估一个字符串。
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
条件的同时避免此问题吗?
答案 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 .....