我的作业错了这个问题,我无法弄清楚原因:
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分,但是标记不正确。为什么呢?
答案 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)
提示:在静态范围内,它是未初始化的。你能搞清楚为什么吗?