2

我在作业中弄错了这个问题,我不知道为什么:

procedure Main is
    X: Integer;
    procedure Sub1 is
       X: Integer;
    begin -- of Sub1
       Put(X);
    end; -- of Sub1
    procedure Sub2 is
       X: Integer;
    begin -- of Sub2
       X:=5;
       Sub1;
    end; -- of Sub2
begin -- of Main
    X:=12;
    Sub2;
end; -- of Main

问题是:假设以下 Ada 程序是使用静态范围规则编译和执行的。在 Sub1 的程序中打印 X 的什么值?如果它在动态范围规则下怎么办?

我分别得到了 12 和 5,但这被标记为不正确。为什么?

4

3 回答 3

2

更仔细地逐步完成程序。Sub1 中的值来自哪里?

于 2009-03-06T23:28:01.333 回答
2

Ada 使用静态(词法)范围规则,但即使没有,也很难看出 Sub1 中的 Put(X) 除了上面未初始化的 X 2 行之外还指的是什么。打印的值可能取决于操作系统、使用的编译器标志,甚至可能取决于一天中的时间。

更正代码后,答案(在 Mac OS X 上使用各种 GNAT)都是 0,所有这些都使用 -O2,但没有优化 GCC 4.3.3 得到 42291,GNAT GPL 2009(它是一个 64 位编译器)得到 16777216 ,对 32 位的 GNAT GPL 2009 重新编译得到 1。

于 2009-09-03T22:09:36.053 回答
1

提示:在静态作用域下它是未初始化的。你能弄清楚为什么吗?

于 2009-03-06T23:29:50.177 回答