lua2.1 全局变量和局部变量(完善中)
来源:互联网 发布:注册淘宝店铺 编辑:程序博客网 时间:2024/04/29 23:06
变量是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;
end
func1(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系列的指令只会修改栈上的数据。
- lua2.1 全局变量和局部变量(完善中)
- lua2.1函数调用过程分析(完善中)
- 局部变量和全局变量(成员变量)
- C/C++中全局变量和局部变量
- SQL中全局变量和局部变量
- c语言中全局变量和局部变量
- PHP中全局变量和局部变量详解
- php中局部变量和全局变量
- Labview 中局部变量和全局变量
- java中局部变量和全局变量
- JS中全局变量和局部变量
- 局部变量和全局变量
- 局部变量和全局变量
- 全局变量和局部变量
- 局部变量和全局变量
- 全局变量和局部变量
- 局部变量和全局变量
- 全局变量和局部变量
- 泡实验室更让我激情满怀
- 经典相册效果
- CCBN和IDF相关
- PHP+APACHE+MYSQL
- lua2.1函数调用过程分析(完善中)
- lua2.1 全局变量和局部变量(完善中)
- 图像过来
- 海边一日游
- 了解指针不再困难
- 农历天干地支算法
- BYTE,WORD,DWORD
- C语言宏定义技巧(常用宏定义)
- 引用的作用
- C#实现图片特效 ( 一)(转)