如果您的函数anotherfunc()
在此代码上被调用
if (somefunc() = False and anotherfunc() = True) then
那么你已经设置了BOOLEVAL ON
正如大卫指出的编译器首先评估False and anotherfunc()
在BOOLEVAL OFF
编译器知道的模式下,这False and AnyBoolState
将导致False
因此anotherfunc()
不会被调用(实际上它永远不会被调用)。
作为一个简单的测试,我扩展了jachaguate程序来显示你的表情
program AndEvaluation;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
function FalseFunc( const AName : string ) : Boolean;
begin
Write( AName, '(False)', '-' );
Result := False;
end;
function TrueFunc( const AName : string ) : Boolean;
begin
Write( AName, '(True)', '-' );
Result := True;
end;
begin
try
// (somefunc() = False and anotherfunc() = True)
//
// in this testcase translated to:
//
// somefunc() => FalseFunc( 'First' )
// False => FalseFunc( 'Second' )
// anotherfunc() => TrueFunc( 'Third' )
// True => TrueFunc( 'Fourth' )
{$B+}
Writeln( 'BOOLEVAL ON' );
if ( FalseFunc( 'First' ) = FalseFunc( 'Second' ) and TrueFunc( 'Third' ) = TrueFunc( 'Fourth' ) )
then
Writeln( 'True' )
else
Writeln( 'False' );
{$B-}
Writeln( 'BOOLEVAL OFF' );
if ( FalseFunc( 'First' ) = FalseFunc( 'Second' ) and TrueFunc( 'Third' ) = TrueFunc( 'Fourth' ) )
then
Writeln( 'True' )
else
Writeln( 'False' );
except
on E : Exception do
Writeln( E.ClassName, ': ', E.Message );
end;
ReadLn;
end.
现在让我们看看结果
BOOLEVAL ON
Second(False)-Third(True)-First(False)-Fourth(True)-True
BOOLEVAL OFF
First(False)-Second(False)-Fourth(True)-True
正如输出所解释的那样,在调用之前BOOLEVAL ON
调用你的anotherfunc()
意志。 somefunc()
与BOOLEVAL OFF
你anotherfunc()
的永远不会被调用。
如果你想拥有相同的
if (somefunc() == FALSE && anotherfunc() == FALSE)
你必须这样翻译
if ( somefunc() = False ) and ( anotherfunc() = False ) then
或者更好更短的方法
if not somefunc() and not anotherfunc() then
或者甚至更短
if not( somefunc() or anotherfunc() ) then
但是为了避免anotherfunc()
每次你必须设置时都被调用BOOLEVAL OFF