Pascal 关于静态和动态范围界定问题

Pascal 关于静态和动态范围界定问题,pascal,scoping,Pascal,Scoping,您能确认我对以下代码的回答吗: procedure main var x,y,z; procedure sub1 begin var x,z x := 6; z := 7; sub2(); x := y*z + x; print(x); end procedure sub2 begin var x,y

您能确认我对以下代码的回答吗:

procedure main
var x,y,z;

    procedure sub1
       begin
        var x,z 
        x := 6;
        z := 7;
        sub2();
        x := y*z + x;
        print(x);       
      end
    procedure sub2
      begin
        var x,y
        x := 1;
        y := x+z+2;
        print(y);       
      end
begin
    x := 1; y:=3; z:=5;
    sub1();
    sub2();
end 
我得到:

  • 静态:

    8
    27
    
  • 动态:

    10
    27
    

对吗?

我不知道静态和动态是什么意思。Pascal始终在最内部的作用域中使用变量。如果你用这个,那么结果是8,27。我不知道你是如何得出另一个结果的(一切都是全球性的?

如果帕斯卡支持动态范围界定,那么你的分析将是正确的。在
sub1
中声明的
z
变量将隐藏在
main
中声明的变量,即使在
sub2
中也是如此。但是在
sub2
中声明的
x
不会影响在
sub1
中声明的
x
的值,因此
sub1
在调用
sub2
后读取
x
时仍然使用原始值6


不过,你的分析是不完整的。每次应该打印三个值,而不仅仅是两个。在这两种情况下,打印的第三个值都应该是8。

程序拒绝在此编译。开始..结束内的Var块?sub2需要申报吗?做sub1();也不是正确的pascal,虽然大多数编译器都会接受它,但您的老师可能不会。什么是print()?上面的代码不是有效的Pascal。我同意关于错误语法结构的评论,但我认为这个问题更多的是理论性的,而不是实践性的。这个例子很清楚,尽管在语法上是不正确的(但是,这个标题上可能应该有某种免责声明)。