lua2 1 全域性變數和區域性變數(完善中)

2021-05-22 10:10:34 字數 1948 閱讀 5389

變數是lua2.1中的基石,由於各變數的作用的不同,我們一般分為全域性變數和區域性變數,在lua2.1中也有這兩種變數,但是在其內部的

具體實現的卻很難讓人理解,本文主要來**lua2.1中全域性變數和區域性變數的具體實現細節。

與以往的分析不同,這次我們先來個例項。

b = 1;

function func1(c)

local d, d1;

local e;

e = 1;

a = 1;

return a;

end上面的lua語句得到的指令如下:

code

1    adjust   1

3    adjust   3

5    adjust   4

6    push1

7    storelocal3

8    push1

9    storeglobal   55

12    pushglobal   55

16    retcode   4

18    adjust   1

20    retcode   1

code

0    push1

1    storeglobal   50

4    retcode0

我們之後這個函式func1分析下來一共有四個區域性變數,第乙個區域性變數是在分析func的引數的時候得到的,伴隨這個變數的確定還有

一條指令是adjust 1來調整棧頂使得引數數量為1;第二和第三個區域性變數是在分析語句local d, d1的時候確定的,我們現在可以先

斷定乙個local關鍵字會帶來一調adjust指令,那麼時會有指令adjust 3。第四個和前面兩個一樣。那麼接著的a是區域性變數嗎?顯然

不是,因為它分析的結果是push1 storeglobal 55,說明它是全域性變數。好了,到目前為止我們知道有兩種情況可以使的乙個變數

成為區域性變數,第乙個是形參,第二個是被關鍵字local修飾過的變數。其它的**不離十是全域性變數。

下面我們考慮幾種情況:

情況1:使用乙個已有的全域性變數的名字作為區域性變數

b = 1;

function func1(c)

local b;

b = 2;

end指令:

code

1    adjust   1

3    adjust   2

4    push2

5    storelocal1

7    adjust   1

9    retcode   1

code

0    push1

1    storeglobal   50

4    retcode0

通過指令我們知道函式func1執行過後並不會修改全域性變數b的值。

情況2:將全域性變數作為引數傳入的時候

b = 1;

function func1(c)

c = 2;

endfunc1(b);

code

1    adjust   1

2    push2

3    storelocal0

5    retcode   1

指令:code

0    push1

1    storeglobal   50

4    pushglobal   52

7    pushglobal   50

10    callfunc 1 0

13    retcode0

通過指令我們知道func1使用的只是b的拷貝,所以函式中對引數c的修改並不能對b的值造成影響,

另外乙個原因是,如果想修改乙個全域性變數,那麼你必須使用storeglobal之類的指令才行,

storelocal系列的指令只會修改棧上的資料。

Lua 全域性變數和區域性變數

在lua中宣告乙個全域性變數很簡單 a 5直接賦值就可以,而且也不會限制變數的型別,我們可以直接把number型別的變數賦值string a hello 宣告乙個區域性變數需要在前面加上關鍵字 local local b 10區域性變數在當前 塊結束後就會銷毀 用do end命令建立乙個 塊 do ...

全域性變數和區域性變數

全域性變數 可以被不同的函式 類或檔案呼叫的變數,在函式外定義。區域性變數 只能在函式內使用,定義在函式內。區域性變數的使用 class myclass def myfun num 12 print myfun num num 正確 def myfun2 num num 1 print mufun ...

全域性變數和區域性變數

區域性變數 在方法中開闢的變數,只在方法中有效 區域性變數在定義時不會初始化,要顯式的給它乙個值 如未給它乙個初始值,雖然編譯的時候會通過,但是執行的時候會產生為初始化錯誤!方法呼叫 執行完,區域性變數便會自動釋放。在方法內的語句塊中建立的變數在編譯時假如未初始,如若使用,也會報未初始化錯誤!呼叫的...