邏輯運算子

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)。