中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Lua中的三目運算怎么理解

發布時間:2022-02-18 15:33:10 來源:億速云 閱讀:150 作者:iii 欄目:開發技術

這篇文章主要講解了“Lua中的三目運算怎么理解”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Lua中的三目運算怎么理解”吧!

Lua 是一種輕量小巧的腳本語言,用標準C語言編寫并以源代碼形式開放, 其設計目的是為了嵌入應用程序中,從而為應用程序提供靈活的擴展和定制功能。

Lua中的三目運算怎么理解

三目運算

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

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

//三目運算符
ret = a > b ? a : b;

Lua 中的三目運算

Lua 原生的語義并沒有實現三目運算,一般是通過邏輯運算符 and 和 or 來模擬三目運算符的。

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

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

窮舉所有可能性:

a > b 時:

a > b and a –> truea or b –> a

a

a > b and a –> falsea or b –> b

完美!

Lua 中的三目運算符陷阱

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

  • 三目運算的一般形式a ? b : c

    a = true,結果為b a = false,結果為c

  • 對應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

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

一般化的 a and b or c

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

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

在校時第一次看到本題,第一反應如下:

#define MIN(A,B) A

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

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

還有好奇心的同學可以參考:宏定義的正確寫法,三目運算的宏定義

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

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

感謝各位的閱讀,以上就是“Lua中的三目運算怎么理解”的內容了,經過本文的學習后,相信大家對Lua中的三目運算怎么理解這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

lua
AI

甘谷县| 柘荣县| 桑日县| 永胜县| 华宁县| 壤塘县| 舞阳县| 天长市| 岫岩| 安远县| 迁西县| 奉节县| 博客| 威海市| 温宿县| 交城县| 广德县| 临高县| 深水埗区| 敦化市| 淄博市| 蓬安县| 白玉县| 永胜县| 贵德县| 岗巴县| 孟连| 耒阳市| 资兴市| 东港市| 延长县| 商南县| 泰顺县| 新平| 福清市| 广宗县| 平罗县| 新巴尔虎左旗| 依安县| 夏邑县| 故城县|