【问题标题】:Pascal static and dynamic scope prob?帕斯卡静态和动态范围问题?
【发布时间】:2013-11-20 18:28:04
【问题描述】:

如果 pascal 使用动态范围,这段代码的结果是什么?? 通过使用静态范围,我得到了这些结果! x=32 , y=39 和 z=105

program what(output);

var 
  y, z: integer;

procedure p(x, z: integer);

  procedure a(y: integer);
  begin (* of procedure a *)
    writeln(x, y, z);
    x := x + 5;
  end;

  procedure b(x:integer);
  begin (* of procedure b *)
    writeln(x, y, z);
    y := y + 2;
    a(x + 7);
  end;
begin (* of procedure p *)
  b(32);
  writeln(x, y, z);
  a(47);
  writeln(x, y, z);
end;

procedure q(x,y:integer);
begin (* of procedure q *)
  p(x + 4, x + y);
  writeln(x, y, z);
end;

begin (* of program what *)
  y := 21; 
  z := 105; 
  q(y + 1, y + z);
  writeln(y, z);
end.

【问题讨论】:

  • 这是哪种帕斯卡?到目前为止,它无法编译到我所知道的任何内容中。
  • @TLama:令人惊讶的是,它实际上可以编译。它会生成一个[dcc32 Warning] Project1.dpr(30): W1011 Text after final 'END.' - ignored by compiler,但 XE5 会编译它。 ???
  • 我没有得到相同的结果:我得到的最终输出是 Y = 23, Z = 105。
  • @TLama:查看帮助文件。在 XE5 的 docwiki 中,它是 here,在 The Program Heading 下:在标准 Pascal 中,程序标题可以在程序名称后包含参数:program Calc(input, output); Embarcadero 的 Delphi 忽略这些参数。 (强调我的。)
  • 它们是文件句柄 iirc。前两个是标准输入和输出,其余的是额外文件。 IIRC 一些旧操作系统(VMS?)需要在命令行上声明所有要访问的文件。如此声明但未分配的文件是临时文件。 (GNU Pascal 站点和 Scott Moore 的常见问题解答对此有一些信息。(ISO Pascal)。TP 已经跳过了这个,FPC 也这样做了,但是对于 ISO 模式,这实际上是一个错误 :-)

标签: dynamic static scope pascal


【解决方案1】:

我认为主要区别在于函数 a() 会看到其调用者的 ("b()"'s) x,而不是来自父过程 (p) 的那个。

【讨论】:

  • 是的。这里的问题与“动态”和“静态”无关;这是一个变量范围问题(局部变量可见,而不是范围更广的变量)。这可能会有所帮助:Blocks and Scope,特别是关于 Scope 的部分 - 带有可见性规则的表格非常清楚。
  • 实际上,同一部分在“范围”正下方有一个名为“命名冲突”的部分,很好地解释了这个问题。
  • 没有 afaik 动态/静态范围是正确的术语。静态通常是固定的编译时间,如 Delphi/Pascal,动态意味着确切的调用链对作用域很重要。不过,这通常适用于脚本语言。 (通常很快就会遇到扩展瓶颈)
猜你喜欢
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
  • 2015-09-13
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 2021-01-05
相关资源
最近更新 更多