回 帖 发 新 帖 刷新版面

主题:哥子些帮下忙

全局变量和局部变量的区别。啥时候局部变量的值会参入全局变量。

回复列表 (共4个回复)

沙发

全局变量:指整个程序都有效的变量,也就是在程序的开头说明的变量。
局部变量:指只在说明这个变量的程序模块中有效。
如果一个局部变量在其它程序模块中又被说明,就出现了变量同名问题,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。最后,结束程序。

板凳

怎么这么强!程序居然有小小错误...应该是:
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 楼

局部变量只在子程序中才起作用,全局变量通用,定义名称相同就是全局变量。

4 楼

谢了,我懂了。

我来回复

您尚未登录,请登录后再回复。点此登录或注册