邏輯運算子
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)。