亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

Lua教程(三):表達式和語句

2024-07-21 23:04:43
字體:
來源:轉載
供稿:網友

一、表達式:

    1. 算術操作符:
    Lua支持常規算術操作符有:二元的“+”、“-”、“*”、“/”、“^”(指數)、“%”(取模),一元的“-”(負號)。所有這些操作符都可用于實數。然而需要特別說明的是取模操作符(%),Lua中對該操作符的定義為:
 

復制代碼 代碼如下:

    a % b == a - floor(a / b) * b
 

    由此可以推演出x % 1的結果為x的小數部分,而x - x % 1的結果則為x的整數部分。類似的,x - x % 0.01則是x精確到小數點后兩位的結果。
    
    2. 關系操作符:
    Lua支持的關系操作符有:>、<、>=、<=、==、~=,所有這些操作符的結果均為true或false。
    操作符==用于相等性測試,操作符~=用于不等性測試。這兩個操作符可以應用于任意兩個值。如果兩個值的類型不同,Lua就認為他們不等。nil值與其自身相等。對于table、userdata和函數,Lua是通過引用進行比較的。也就是說,只有當他們引用同一個對象時,才視為相等。如:
復制代碼 代碼如下:

a = {}
a.x = 1
a.y = 0
b = {}
b.x = 1
b.y = 1
c = a

 

其結果是a == c,但a ~= b。
    對于字符串的比較,Lua是按照字符次序比較的。
    
    3. 邏輯操作符:

    Lua支持的邏輯操作符有:and、or和not。與條件控制語句一樣,所有的邏輯操作符都將false和nil視為假,其他的結果均為真。和其他大多數語言一樣,Lua中的and和or都使用“短路原則”。在Lua中有一種慣用寫法"x = x or v",它等價于:if not x then x = v end。這里還有一種基于“短路原則”的慣用寫法,如:
 

復制代碼 代碼如下:

    max = (x > y) and x or y
 

    這等價于C語言中max = (x > y) ? x : y。由于x和y均為數值,因此它們的結果將始終為true。
    
    4. 字符串連接:
    前一篇Blog已經提到了字符串連接操作符(..),這里再給出一些簡單的示例。
 
復制代碼 代碼如下:

    /> lua
    > print("Hello " .. "World)
    Hello World
 

    > print(0 .. 1)  --即使連接操作符的操作數為數值類型,在執行時Lua仍會將其自動轉換為字符串。
    01

 

    5. table構造器:

    構造器用于構建和初始化table的表達式。這是Lua特有的表達式,也是Lua中最有用、最通用的機制之一。其中最簡單的構造器是空構造器{},用于創建空table。我們通過構造器還可以初始化數組,如:

 

復制代碼 代碼如下:

days = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}
for i = 1,#days do
    print(days[i])
end
--輸出結果為
--Sunday
--Monday
--Tuesday
--Wednesday
--Thursday
--Friday
--Saturday

 

從輸出結果可以看出,days在構造后會將自動初始化,其中days[1]被初始化為"Sunday",days[2]為"Monday",以此類推。
    Lua中還提供了另外一種特殊的語法用于初始化記錄風格的table。如:a = { x = 10, y = 20 },其等價于:a = {}; a.x = 10; a.y = 20
    在實際編程時我們也可以將這兩種初始化方式組合在一起使用,如:

復制代碼 代碼如下:

polyline = {color = "blue", thickness = 2, npoints = 4,
    {x = 0, y = 0},
    {x = 10, y = 0},
    {x = -10, y = 1},
    {x = 0, y = 1} }
print(polyline["color"]);
print(polyline[2].x)
print(polyline[4].y)
--輸出結果如下:
--blue
--10
--1

 

除了以上兩種構造初始化方式之外,Lua還提供另外一種更為通用的方式,如:

復制代碼 代碼如下:

opnames = { ["+"] = "add", ["-"] = "sub", ["*"] = "mul", ["/"] = "div"}
print(opnames["+"])
i = 20; s = "-"
a = { [i + 0] = s, [i + 1] = s .. s, [i + 2] = s..s..s }
print(a[22])

    對于table的構造器,還有兩個需要了解的語法規則,如:
 
復制代碼 代碼如下:

    a = { [1] = "red", [2] = "green", [3] = "blue", }
 

    這里需要注意最后一個元素的后面仍然可以保留逗號(,),這一點類似于C語言中的枚舉。
 
復制代碼 代碼如下:

    a = {x = 10, y = 45; "one", "two", "three" }
 

    可以看到上面的聲明中同時存在逗號(,)和分號(;)兩種元素分隔符,這種寫法在Lua中是允許的。我們通常會將分號(;)用于分隔不同初始化類型的元素,如上例中分號之前的初始化方式為記錄初始化方式,而后面則是數組初始化方式。

 

二、語句:

    1. 賦值語句:

    Lua中的賦值語句和其它編程語言基本相同,唯一的差別是Lua支持“多重賦值”,如:a, b = 10, 2 * x,其等價于a = 10; b = 2 * x。然而需要說明的是,Lua在賦值之前需要先計算等號右邊的表達式,在每一個表達式都得到結果之后再進行賦值。因此,我們可以這樣寫變量交互:x,y = y,x。如果等號右側的表達式數量少于左側變量的數量,Lua會將左側多出的變量的值置為nil,如果相反,Lua將忽略右側多出的表達式。

    2. 局部變量與塊:

    Lua中的局部變量定義語法為:local i = 1,其中local關鍵字表示該變量為局部變量。和全局變量不同的是,局部變量的作用范圍僅限于其所在的程序塊。Lua中的程序可以為控制結構的執行體、函數執行體或者是一個程序塊,如:
    下面的x變量僅在while循環內有效。

復制代碼 代碼如下:

while i <= x do
    local x = i * 2
     print(x)
     i = i + 1
end

    如果是在交互模式下,當執行local x = 0之后,該變量x所在的程序即以結束,后面的Lua語句將被視為新的程序塊。如果想避免此類問題,我們可以顯式的聲明程序塊,這樣即便是在交互模式下,局部變量仍然能保持其塊內有效性,如:
復制代碼 代碼如下:

do
    local a2 = 2 * a
    local d = (b ^ 2 - 4 * a) ^ (1 / 2)
    x1 = (-b + d) / a2
    x2 = (-b - d) / a2
end  --a2和d的作用域至此結束。

 

和其它編程語言一樣,如果有可能盡量使用局部變量,以免造成全局環境的變量名污染。同時由于局部變量的有效期更短,這樣垃圾收集器可以及時對其進行清理,從而得到更多的可用內存。   

    3. 控制結構:
    Lua中提供的控制語句和其它大多數開發語言所提供的基本相同,因此這里僅僅是進行簡單的列舉。然后再給出差異部分的詳細介紹。如:
    1). if then else
 

復制代碼 代碼如下:

    if a < 0 then
        b = 0
    else
        b = 1
    end
   

    2). if elseif else then
 
復制代碼 代碼如下:

    if a < 0 then
        b = 0
    elseif a == 0 then
        b = 1
    else
        b = 2
    end
   

    3). while
 
復制代碼 代碼如下:

    local i= 1
    while a[i] do
        print(a[i])
        i = i + 1
    end
   

    4). repeat
 
復制代碼 代碼如下:

    repeat
        line = io.read()
    until line ~= "" --直到until的條件為真時結束。
    print(line)
   

    5). for
 
復制代碼 代碼如下:

    for var = begin, end, step do --如果沒有step變量,begin的缺省步長為1。
        i = i + 1
    end
 

    需要說明的是,for循環開始處的三個變量begin、end和step,如果它們使表達式的返回值,那么該表達式將僅執行一次。再有就是不要在for的循環體內修改變量var的值,否則會導致不可預知的結果。
    
    6). foreach
 
復制代碼 代碼如下:

    for i, v in ipairs(a) do  --ipairs是Lua自帶的系統函數,返回遍歷數組的迭代器。
        print(v)
    end
   
    for k in pairs(t) do      --打印table t中的所有key。
        print(k)
    end
 

    見如下示例代碼:
 
復制代碼 代碼如下:

 days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }
revDays = {}
for k, v in ipairs(days) do
    revDays[v] = k
end

 

for k in pairs(revDays) do
    print(k .. " = " .. revDays[k])
end

--輸出結果為:
--Saturday = 7
--Tuesday = 3
--Wednesday = 4
--Friday = 6
--Sunday = 1
--Thursday = 5
--Monday = 2
 

 

   7). break
    和C語言中的break語義完全相同,即跳出最內層循環。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
操91在线视频| 亚洲情综合五月天| 久久九九免费视频| 这里只有精品视频在线| 久久久亚洲精品视频| 欧美日本精品在线| 668精品在线视频| 成人精品一区二区三区电影免费| 91九色视频在线| 久久综合色88| 亚洲欧美日韩一区在线| 国产suv精品一区二区| 国产精品户外野外| 欧美影院久久久| 亚洲一区亚洲二区亚洲三区| 亚洲欧洲国产一区| 亚洲欧美另类在线观看| 亚洲女人天堂av| 欧美二区乱c黑人| 国产69精品99久久久久久宅男| 久久综合电影一区| 欧美激情视频一区| 国内精品模特av私拍在线观看| 国产成人久久久精品一区| 97精品国产91久久久久久| 91久久在线观看| 久久噜噜噜精品国产亚洲综合| 国产精品直播网红| 最近2019中文字幕一页二页| 亚洲福利视频在线| 日本最新高清不卡中文字幕| 久久久欧美精品| 日韩电影在线观看免费| 97免费中文视频在线观看| 亚洲精品视频在线播放| 久青草国产97香蕉在线视频| 91精品国产成人www| 136fldh精品导航福利| 成人中文字幕在线观看| 亚洲xxx大片| 欧美乱大交做爰xxxⅹ性3| 国产精品美女久久久久久免费| 国内精品久久久久伊人av| 日韩中文字幕在线看| 成人在线精品视频| 日韩经典中文字幕在线观看| 日韩不卡中文字幕| 亚洲欧美中文字幕在线一区| 亚洲第一在线视频| 亚洲成人av在线| 精品亚洲va在线va天堂资源站| 亚洲免费一级电影| 日韩人在线观看| 国产va免费精品高清在线| 最近中文字幕mv在线一区二区三区四区| 久久久久久免费精品| 精品国产美女在线| 欧美香蕉大胸在线视频观看| 日韩精品视频观看| 色中色综合影院手机版在线观看| 国产精品av免费在线观看| 成人国产精品色哟哟| 成人性教育视频在线观看| 色悠悠久久88| 国产亚洲福利一区| 97福利一区二区| 欧美中文字幕视频| 日韩激情视频在线播放| 福利视频第一区| 中文字幕少妇一区二区三区| 久久av在线播放| 国产精品夜色7777狼人| 97视频在线免费观看| 亚洲视频在线观看| 亚洲欧美成人一区二区在线电影| 一区二区三区视频免费在线观看| 曰本色欧美视频在线| 久久久精品视频在线观看| 日韩激情av在线免费观看| 91夜夜未满十八勿入爽爽影院| 久久综合免费视频影院| 91精品国产91久久久| 最新69国产成人精品视频免费| 在线不卡国产精品| 国产一区二区三区高清在线观看| 亚洲第一男人天堂| 日韩高清欧美高清| 久久精品国产视频| 久久久久久亚洲精品不卡| 久久免费精品视频| 亚洲欧洲在线看| 欧美疯狂xxxx大交乱88av| 国产精品久久一| 国产91精品最新在线播放| 亚洲国产中文字幕久久网| 国产美女高潮久久白浆| 国内精品久久久久久久| 日本欧美精品在线| 亚洲一区二区三区视频播放| 日韩美女视频免费在线观看| 久久天天躁狠狠躁夜夜av| 91精品国产综合久久香蕉的用户体验| 久久久www成人免费精品张筱雨| 日韩一区在线视频| 91久久夜色精品国产网站| 国产成人激情视频| 国产精品美女网站| 欧美日韩国产影院| 国产精品一区二区三区毛片淫片| 97精品一区二区三区| 亚洲精品国偷自产在线99热| 欧美一区二区大胆人体摄影专业网站| 久久亚洲精品国产亚洲老地址| 好吊成人免视频| 国产精品美女久久久免费| 668精品在线视频| 亚洲免费视频观看| 亚洲国产中文字幕在线观看| 国产精品入口尤物| 国产va免费精品高清在线观看| 国产亚洲日本欧美韩国| 亚洲色图35p| 亚洲欧洲午夜一线一品| 中文字幕在线看视频国产欧美在线看完整| 全球成人中文在线| 亚洲视频综合网| 欧美色另类天堂2015| 成人在线中文字幕| 国产精品自拍小视频| 性色av一区二区咪爱| 日本成人黄色片| 色系列之999| 国产一区视频在线| 亚洲free性xxxx护士hd| 97视频在线播放| 国产91对白在线播放| 亚洲免费精彩视频| 亚洲欧洲第一视频| 国产午夜精品视频免费不卡69堂| 亚洲欧美日韩中文视频| 美女黄色丝袜一区| 97视频在线观看视频免费视频| 亚洲国产精品高清久久久| 久久99亚洲精品| 久久男人的天堂| 久久在精品线影院精品国产| 亚洲美女激情视频| 91精品久久久久久久久久另类| 91精品在线播放| 日韩av手机在线| 久久久久久久久国产精品| 日本精品久久久久久久| 亚洲性无码av在线| 亚洲日韩欧美视频| 69视频在线播放| 欧美日韩一区二区免费在线观看| 97视频在线观看成人| 中文字幕一区二区三区电影| 久久久久久久久久久久久久久久久久av| 欧美疯狂做受xxxx高潮| 超在线视频97| 欧美华人在线视频| 国内精品一区二区三区四区| 日本久久91av|