为什么我的作业上的这个项目错了?

时间:2009-03-06 23:16:58

标签: ada scoping

我的作业错了这个问题,我无法弄清楚原因:

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的值是多少?如果它是在dyncamic范围规则下怎么办?

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

3 个答案:

答案 0 :(得分:2)

更仔细地逐步完成该计划。 Sub1中的值来自哪里?

答案 1 :(得分: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。

答案 2 :(得分:1)

提示:在静态范围内,它是未初始化的。你能搞清楚为什么吗?