日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
詳解Lua中的三目運(yùn)算符

Lua 是一種輕量小巧的腳本語言,用標(biāo)準(zhǔn)C語言編寫并以源代碼形式開放, 其設(shè)計目的是為了嵌入應(yīng)用程序中,從而為應(yīng)用程序提供靈活的擴(kuò)展和定制功能。

10年積累的網(wǎng)站建設(shè)、網(wǎng)站制作經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有海珠免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

三目運(yùn)算

熟悉 C/C++ 的老司機(jī)都知道三目運(yùn)算 a ? b : c,這種寫法替換簡單的條件判斷語句可以在不增加閱讀難度的情況下,使代碼盡量保持簡潔。

int a, b, ret;
//if-else
if (a > b)
   ret = a;
else
   ret = b;

//三目運(yùn)算符
ret = a > b ? a : b;

Lua 中的三目運(yùn)算

Lua 原生的語義并沒有實(shí)現(xiàn)三目運(yùn)算,一般是通過邏輯運(yùn)算符 and 和 or 來模擬三目運(yùn)算符的。

Lua 中 and 和 or 都使用”短路求值(short_cur evaluation)”,也就是說,它們只會在需要時才去評估第二個操作數(shù)。(《Lua程序設(shè)計》)

local a, b, ret;
ret = a > b and a or b

窮舉所有可能性:

a > b 時:

a > b and a –> true
a or b –> a

a

a > b and a –> false
a or b –> b

完美!

Lua 中的三目運(yùn)算符陷阱

按照從特殊到一般的原則:

  • 三目運(yùn)算的一般形式a ? b : c

    a = true,結(jié)果為b a = false,結(jié)果為c

  • 對應(yīng)Lua中的a and b or c

    • a = true
    • a = false
    • a and b –> false
    • b or c –> c
    • a and b –> false
    • b or c –> c
    • a = true
    • a = false
    • a and b –> true
    • b or c –> b
    • a and b –> false
    • b or c –> c
    • b = true
    • b = false

可以看到當(dāng) b = false 時,Lua模擬的 a and b or c 始終返回 c 并不能還原三目運(yùn)算符的原貌。

《Lua程序設(shè)計》也建議這種情況使用 if-else 來避免。

一般化的 a and b or c

那么有沒有辦法可以解決 b = false 失效的問題呢?

由此我聯(lián)想到 C 語言有一道常規(guī)的考題:請使用宏定義寫一個返回兩個值中較小值的方法。

在校時第一次看到本題,第一反應(yīng)如下:

#define MIN(A,B) A  

然而這種寫法在很多嵌套的使用環(huán)境中都不能返回正確的結(jié)果。比如:2 * MIN(3, 4)展開為 2 * 3

#define MIN(A,B) ((A)  

還有好奇心的同學(xué)可以參考:宏定義的正確寫法,三目運(yùn)算的宏定義

從這個示例中,我就在想如何能保證 a and b or c 中 b 為真或者 b 不產(chǎn)生歧義呢?

  1. and的運(yùn)算優(yōu)先級高于or,簡單的改變運(yùn)算順序并沒有用。
  2. 這時就想到了lua中萬能的table,能不能把a(bǔ),b,c都放到table中來改變b的存在呢?要注意{nil}也是一個為true的對象。 a,b,c都替換為table:{a} and  or {c}。
  3. 三目運(yùn)算中a是條件,結(jié)果是b或者c。其實(shí)a并不需要放入table中,否則{a}就始終為true了,失去了條件的意義。而 or {c}的結(jié)果也必然是一個table,該table只有一個元素。那么通過[1]即可訪問。
  4. 綜上所述,更一般化的Lua三目運(yùn)算為:(a and or {c})[1]

總結(jié)

誠然,要想知道Lua中三目運(yùn)算的形式,只需通過搜索就可以找到想要的答案。上述的推理過程多少有點(diǎn)先知道答案,故意往答案上靠的嫌疑。不過我堅信證明一個問題,結(jié)論并不是最重要的,重要的是論證的過程。本文僅以我對Lua粗淺的認(rèn)知來嘗試還原一般化的Lua三目運(yùn)算的推導(dǎo)過程,如有更好的推理過程,可以一起交流。


分享文章:詳解Lua中的三目運(yùn)算符
文章起源:http://m.5511xx.com/article/djsddpe.html