Pascal 变量作用域

  • 变量作用域

    任何程序的作用域是程序的一个区域,在该区域中可以存在定义的变量,而超出该变量则无法访问。在三个地方可以使用Pascal编程语言声明变量-
    • 在子程序或称为局部变量的块中
    • 在所有子程序之外,这称为全局变量
    • 在子程序参数的定义中称为形式参数
    让我们来解释一下什么是局部和全局变量和形式参数。
  • 局部变量

    在子程序或块内声明的变量称为局部变量。它们只能由该子程序或代码块中的语句使用。局部变量对于子程序本身是未知的。以下是使用局部变量的示例。在这里,所有变量a,b和c对于名为exLocal的程序都是本地的。
    
    program exLocal; 
    var
       a, b, c: integer;
    
    begin
       (* actual initialization *)
       a := 10;
       b := 20;
       c := a + b;
       
       writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
    end.
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    value of a = 10 b = 20 c = 30
    
    现在,让我们进一步扩展程序,让我们创建一个名为display的过程,该过程将拥有自己的变量a,b和c集,并直接从程序exLocal显示它们的值。
    
    program exLocal;
    var
       a, b, c: integer;
    procedure display;
    
    var
       a, b, c: integer;
    begin
       (* local variables *)
       a := 10;
       b := 20;
       c := a + b;
       
       writeln('Winthin the procedure display');
       writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
    end;
    
    begin
       a:= 100;
       b:= 200;
       c:= a + b;
       
       writeln('Winthin the program exlocal');
       writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
       display();
    end.
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    Within the program exlocal
    value of a = 100 b = 200 c = 300
    Within the procedure display
    value of a = 10 b = 20 c = 30
    
  • 全局变量

    全局变量是在函数外部定义的,通常在程序顶部。全局变量将在程序的整个生命周期内保持其值,并且可以在为该程序定义的任何函数中访问它们。一个全局变量可以被任何函数访问。也就是说,在声明之后,全局变量可在整个程序中使用。以下是使用全局和局部变量的示例-
    
    program exGlobal;
    var
       a, b, c: integer;
    procedure display;
    var
       x, y, z: integer;
    
    begin
       (* local variables *)
       x := 10;
       y := 20;
       z := x + y;
       
       (*global variables *)
       a := 30;
       b:= 40;
       c:= a + b;
       
       writeln('Winthin the procedure display');
       writeln(' Displaying the global variables a, b, and c');
       
       writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
       writeln('Displaying the local variables x, y, and z');
       
       writeln('value of x = ', x , ' y =  ',  y, ' and z = ', z);
    end;
    
    begin
       a:= 100;
       b:= 200;
       c:= 300;
       
       writeln('Winthin the program exlocal');
       writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
       
       display();
    end.
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    Within the program exlocal
    value of a = 100 b = 200 c = 300
    Within the procedure display
    Displaying the global variables a, b, and c
    value of a = 30 b = 40 c = 70
    Displaying the local variables x, y, and z
    value of x = 10 y = 20 z = 30
    
    请注意,过程显示可以访问变量a,b和c,它们是关于显示的全局变量以及它自己的局部变量。程序的局部变量和全局变量可以具有相同的名称,但函数内局部变量的值将优先。让我们稍微更改前面的示例,现在过程显示的局部变量与a,b,c具有相同的名称-
    
    program exGlobal;
    var
       a, b, c: integer;
    procedure display;
    
    var
       a, b, c: integer;
    
    begin
       (* local variables *)
       a := 10;
       b := 20;
       c := a + b;
       
       writeln('Winthin the procedure display');
       writeln(' Displaying the global variables a, b, and c');
       
       writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
       writeln('Displaying the local variables a, b, and c');
       
       writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
    end;
    
    begin
       a:= 100;
       b:= 200;
       c:= 300;
       
       writeln('Winthin the program exlocal');
       writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);   
       
       display();
    end.
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    Within the program exlocal
    value of a = 100 b = 200 c = 300
    Within the procedure display
    Displaying the global variables a, b, and c
    value of a = 10 b = 20 c = 30
    Displaying the local variables a, b, and c
    value of a = 10 b = 20 c = 30