逻辑运算符

VFP 中的逻辑运算符按其优先顺序排列:

操作者 描述
() 括号,组表达式
不,! 从逻辑上否定了表达。不要或! 没有区别。
逻辑和表达式
要么 逻辑上 OR 表达式
<>, !=,# 检查不相等。因此与逻辑排斥 OR-XOR 相同

在历史上,NOT,AND,OR 被写为 .NOT。,。AND。,。OR。如果你愿意,你仍然可以使用它们,但是 AND,OR,NOT 更简单,更清洁。

对于假和真,你必须使用 .F。和 T。文字分别。你不能选择使用 F 和 T.

* Some logical variables
local llOld, llEmail  && any variable declaration implicitly initializes the variable as .F. - false
? m.llOld, m.llEmail && Prints .F. .F.

llOld   = .T.
llEmail = .F.

if ( m.llOld AND m.llEmail )
   ? 'Old AND should be emailed to'
endif
if ( m.llOld OR m.llEmail )
   ? 'Old OR should be emailed to'
endif
if ( m.llOld AND !m.llEmail ) && Same as (m.llOld AND NOT m.llEmail)
   ? 'Old BUT should NOT be emailed to'
endif

* Above code outputs
Old OR should be emailed to
Old BUT should NOT be emailed to

在 VFP 中,逻辑表达式以快捷方式进行评估。也就是说,如果检查的第一部分满足整个结果,则甚至解释表达式的其余部分。样本如下:

? 1 = '2' && An obvious error. It would complain operator/operand type mismatch.

* However we could use such an expression in an if and get no error
* because it is not interpreted at all 
* (VFP is dynamic and there is no compile time check)

local llProcess
llProcess = .T.

if (m.llProcess OR (1='2'))
   ? 'Should do processing'
endif

* Would output

Should do processing

* without any error because m.llProcess true means
* the whole expression would be true, thus the expression after OR 
* is not interpreted at all.

抓住新手的一个陷阱是,有时你可能需要多次检查,例如在 SQL 查询中,这些检查与 AND,OR 运算符连接。当它们中有许多时,人们可能会忽略运算符具有优先级(按顺序(),NOT,AND,OR)这一事实,并认为解释将在链中从左到右完成。考虑一个示例:

select * from myTable where !isCustomer AND debit > 5000 OR discount > 5

这个查询的意图是什么?如果我们使用分组括号明确表示:

((NOT isCustomer) AND debit > 5000) OR discount > 5

简化它看起来像 firstExpression 或(折扣> 5)。无论意图是什么,因为这个 OR 会选择:

所有具有(折扣> 5)的行 - 以及具有超过 5000 借记的客户的那些行。

可能意图是“给我那些不是客户的东西(借记超过 5000 或折扣超过 5)”。如果我们使用括号,从一开始就很清楚:

select * from myTable where !isCustomer AND (debit > 5000 OR discount > 5)

你可以使用但不值得为初始 NOT 运算符使用括号,当它的操作数是一个单独的表达式时,它的优先级是可读的 - !isCustomer 清楚地读作(NOT isCustomer)。