Lua中and、or的一些特殊用法


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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM