主题:哥子些帮下忙
菜鸟皇帝
[专家分:0] 发布于 2007-09-08 20:20:00
全局变量和局部变量的区别。啥时候局部变量的值会参入全局变量。
回复列表 (共4个回复)
沙发
Matodied [专家分:7560] 发布于 2007-09-08 21:41:00
全局变量:指整个程序都有效的变量,也就是在程序的开头说明的变量。
局部变量:指只在说明这个变量的程序模块中有效。
如果一个局部变量在其它程序模块中又被说明,就出现了变量同名问题,PASCAL规定:局部变量在哪个模块中说明的,它的作用域就局限于这个模块,就算其它模块又说明了它,它和其它模块说明的它的同名变量依然是不同的变量。
举个例子:
VAR
a: INTEGER;
PROCEDURE s(i: INTEGER);
VAR
b: INTEGER;
BEGIN
b := 1; a := a + b + i;
WRITELN(a, ' ', b);
END;
VAR
b: INTEGER;
BEGIN
a := 1; b := 2; s(b); WRITELN(a, ' ', b);
END;
运行结果:
4 1
4 2
在这个程序中,a是全局变量,它的作用域是整个程序(主程序和过程s),而b是局部变量,虽然它在主程序和过程s中都被说明过,但它们是两个不同的变量。
我们来分析一下程序执行过程:
首先说明变量a,开辟变量空间a。
接下来进入主程序。先说明变量b,由于它是一个作用域限于主程序的变量,我们称它为b(主)。
执行赋值语句:a := 1; b(主) := 2;
接着就进入了过程s。首先参数i := 2。这里说明的b是和b(主)同名但作用域不同的b(s),它的作用域是s过程。接着执行2条赋值语句(这里的b都是b(s)),执行后b(s) := 1; a := 4,接着输出a和b(s)的值4和1。
执行到END;语句,结束过程s,这样变量b(s)的空间被收回,b(s)就没有意义了。
回到主程序,b又变成了b(主),值为2。而a的值4没有被冲掉,因此接下来输入的a和b的值分别是4和2。最后,结束程序。
板凳
abcwuhang [专家分:1840] 发布于 2007-09-08 22:38:00
怎么这么强!程序居然有小小错误...应该是:
VAR
a,b: INTEGER;
PROCEDURE s(i: INTEGER);
VAR
b: INTEGER;
BEGIN
b := 1; a := a + b + i;
WRITELN(a, ' ', b);
END;
BEGIN
a := 1; b := 2; s(b); WRITELN(a, ' ', b);
END;
其实局部变量和全局变量若变量名相同,它们的内容不相通.
3 楼
万里长城 [专家分:340] 发布于 2007-09-09 18:48:00
局部变量只在子程序中才起作用,全局变量通用,定义名称相同就是全局变量。
4 楼
菜鸟皇帝 [专家分:0] 发布于 2007-09-18 20:23:00
谢了,我懂了。
我来回复