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。我同意关于错误语法结构的评论,但我认为这个问题更多的是理论性的,而不是实践性的。这个例子很清楚,尽管在语法上是不正确的(但是,这个标题上可能应该有某种免责声明)。