逻辑运算符
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)。