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


Lua中的邏輯運算符:與(and)、或(or)和非(not),與其它語言的邏輯運算符功能一致,這里不做贅述。僅僅說一點,全部的邏輯運算符將falsenil視為假,其它不論什么東西視為真。0也視為真

這里要說的是andor的一些特殊使用方法。

當連接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)

執行結果:


以上兩點我之前都是硬記的,但發現過了一段時間后就會忘或者弄混,后來自己總結了一個方法記憶,再也不會弄混了。這種方法就是依照andor的邏輯特性來聯想記憶


1).先說and:我們知道and是取與,與就是0 and 0 = 00 and 1 = 01 and 1 = 1,也就是說有一個為0值就為0,全為1表達式值才為1。所以。當and的第一個操作數為0的時候。我們就沒有必要看后面的操作數了,此時表達式的值已經為0,我們就把第一個為0的操作數返回即可;假設第一個操作數為1,那么整個表達式的值就取決於第二個操作數了,第二個為0表達式值為0。第二個為1表達式值為1,所以由於第二個操作數是啥表達式值就是啥。那么我們就把第二個操作數返回即可了。


2).再說or,也是一個道理:or是取或。或就是0 or 0 = 00 or 1 = 11 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,比如選出xy中的較大者。能夠使用一下語句:

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