避免完全检查if语句

use*_*184 0 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;
Run Code Online (Sandbox Code Playgroud)

但如果L = 0,(S[i] > ' ')则会产生Access违规.我能在保持这种if状况的同时避免这个问题吗?

Jen*_*nsG 10

您需要{$B-}在代码之上添加语句,或在项目设置中启用布尔短路评估.

由于{$B-}是默认值,您可能之前已将其打开,或者某个{$B+}指令正在将其关闭.

短路评估模式下{$B-},Delphi创建(大致)等效的代码:

 if (L > 0) then begin
    if (S[i] > ' ') then begin        
       if (S[L] > ' ') then begin     
          .....
       end;
    end;
 end;
Run Code Online (Sandbox Code Playgroud)

相比之下,使用完全布尔评估模式{$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 .....
Run Code Online (Sandbox Code Playgroud)