1.局部變數
局部變數的聲明關鍵字:local.
局部變數的範圍是聲明塊,指的是函數體,或者是一個chunk。
例子:
local a,b=1,10if a<b thenprint(a)local aprint(a)endprint(a,b)
可以用do..end語言來控制局部變數的範圍,例如求解二元一次方程二元一次:
a,b,c=1,4,1dolocal a2=2*alocal delta=(b^2-4*a*c)^(1/2)x1=(-b+delta)/a2x2=(-b-delta)/a2endprint(x1,x2)
a2和delta都聲明為局部變數,在chunk運行結束之後思動銷毀。
在Lua中應當儘可能地去使用local聲明,因為:
1)可以不影響全域成員的情況下重複使用變數名;
2)使用局部變數會更快一些;
3)當局部變數的chunk代碼執行完畢,局部變數就會自動釋放被佔用的記憶體。
還有一個常用的用法就是:
local foo=foo
這樣做的用處是:保護全域變數不被修改;快速存取。
2.流程式控制制
首先要注意一點:除nil和false之外的所有值在判斷中都為真,包括0和Null 字元。
lua中的流程式控制制主要包括if,while,repeat,各舉一例。
if,簡單的計算機
print("Input a Formula with two number:")s=io.read()a=string.sub(s,1,1)b=string.sub(s,3,3)op=string.sub(s,2,2)if op == "+" thenr = a + belseif op == "-" thenr = a - belseif op == "*" thenr = a*belseif op == "/" thenr = a/belseerror("invalid operation")endprint(s.."="..r)
while,遍曆數組求最大值
a={3213,132,25}local i=1max=a[1]repeatprint(a[i])if max<a[i] then max=a[i] endi=i+1until a[i]==nilprint("max:"..max)
repeat,改寫上面的吧(感覺就是c中的do...while,先執行再判斷)
a={1,23,4,45,64,2,132,25}local i=2max=a[1]while a[i] doprint(a[i])if max<a[i] then max=a[i] endi=i+1endprint("max:"..max)
3.兩種for迴圈
lua中的阿for迴圈有兩中,numeric for 和generic for
numeric for的基本形式是:
for var=exp1,exp2,exp3 do <something>end
exp1是起點,exp2是終點,exp3是步長,可以不寫,預設的話為1。
要注意兩點:1)三個運算式都只計算一次;2)迴圈控制變數是局部變數,迴圈結束之後自動銷毀;3)不要試圖在迴圈中改變迴圈控制變數,結果是不可預測的;4)跳出for迴圈用break。
generic for是通過迭代器的方式遍曆所有元素,例如列印數組:
days = {"Sunday", "Monday", "Tuesday", "Wednesday","Thursday", "Friday", "Saturday"}for k,v in pairs(days) do print(k..":"..v) end
下面是一個插入排序的例子:
a={2,321,23123,32,11}--for i=1,5 do--a[i]=io.read()--endfor i=1,5 dok=ifor j=i+1,5 doif a[k]>a[j] thenk=jendendtmp=a[i]a[i]=a[k]a[k]=tmpendprint("After Sort:");for i=1,#a doprint(a[i])end
4.break和return
break語句用來退出當前迴圈(for、repeat、while)。在迴圈外部不可以使用。
return用來從函數返回結果,當一個函數自然結束時,結尾會有一個預設的return。
Lua文法要求break和return只能出現在block的結尾一句(也就是說:作為chunk的最後一句,或者在end之前,或者else前,或者until前)