Lua中的邏輯運算符:與(and)、或(or)和非(not),與其它語言的邏輯運算符功能一致,這里不做贅述。僅僅說一點,全部的邏輯運算符將false和nil視為假,其它不論什么東西視為真。0也視為真。
這里要說的是and和or的一些特殊使用方法。
當連接2個操作數時:
1.對於運算符and來說,假設它的第一個操作數為假,就返回第一個操作數;不然返回第二個操作數。
所以,
a = b and c
等價於:
if not b then a = b else a = c end
舉個栗子:
print(2 and 3) print(0 and 3) print(nil and 7) print(false and 7)
執行結果:
2.對於運算符or來說,假設它的第一個操作數為真。就返回第一個操作數,不然返回第二個操作數。
所以 ,
a = b or c
等價於:
if b then a=b else a=c end
舉個栗子:
print(4 or 5) print(0 or 5) print(nil or 8) print(false or 8)
執行結果:
以上兩點我之前都是硬記的,但發現過了一段時間后就會忘或者弄混,后來自己總結了一個方法記憶,再也不會弄混了。這種方法就是依照and和or的邏輯特性來聯想記憶。
1).先說and:我們知道and是取與,與就是0 and 0 = 0、0 and 1 = 0、1 and 1 = 1,也就是說有一個為0值就為0,全為1表達式值才為1。所以。當and的第一個操作數為0的時候。我們就沒有必要看后面的操作數了,此時表達式的值已經為0,我們就把第一個為0的操作數返回即可;假設第一個操作數為1,那么整個表達式的值就取決於第二個操作數了,第二個為0表達式值為0。第二個為1表達式值為1,所以由於第二個操作數是啥表達式值就是啥。那么我們就把第二個操作數返回即可了。
2).再說or,也是一個道理:or是取或。或就是0 or 0 = 0、0 or 1 = 1、1 or 1 = 1。也就是說有一個為1值就為1,全為0表達式值才為0,所以。當or的第一個操作數為1的時候,我們就沒有必要看后面的操作數了,此時表達式的值已經為1,我們就把第一個為1的操作數返回即可;假設第一個操作數為0。那么整個表達式的值就取決於第二個操作數了。第二個為0表達式值為0,第二個為1表達式值為1。所以由於第二個操作數是啥表達式值就是啥,那么我們就把第二個操作數返回即可了。
好了。依照我以上的方法,當有多個操作數時也能夠類推出結果:
3.and連接多個操作數時,表達式的返回值就是從左到右第一個為假的值。若全部操作數值都不為假。則表達式的返回值為最后一個操作數
舉個栗子:
print(2 and 3 and 4 and nil and false and 7 and 8) print(2 and 3 and 4 and 5 and 6 and 7 and 8)
執行結果:
4.or連接多個操作數時,表達式的返回值就是從左到右第一個不為假的值,若全部操作數值都為假,則表達式的返回值為最后一個操作數
舉個栗子:
print(nil or false or 6 or 7 or 8) print(nil or false ) print(false or nil )
執行結果:
此外,Lua中還常常會用到 "a and b or c ",這相似於C語言中的表達式 a ? b : c,比如選出x和y中的較大者。能夠使用一下語句:
max = (x>y) and x or y
證明例如以下:
若 x>y,則 (x>y) = true,則 (x>y) and x = x,則 max = x or y = x;
若 x<y,則 (x>y) = false,則 (x>y) and x = (x>y),則 max = (x>y) or y = y。
以上。