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

Adaは静的(字句)スコープルールを使用しますが、そうでない場合でも、Sub1のPut(X)が、その上の初期化されていないX2行以外に何を参照できるかを確認するのは困難です。印刷される値は、OS、使用されるコンパイラフラグ、さらには時刻によっても異なる可能性があります。

コードを修正した後、答え(Mac OS XでさまざまなGNATを使用)は0でしたが、すべてに-O2を使用しましたが、最適化を行わないと、GCC 4.3.3は42291を取得し、GNAT GPL 2009(64ビットコンパイラ)は16777216を取得します。 、および32ビット用のGNATGPL2009の再コンパイルは1になります。

于 2009-09-03T22:09:36.053 に答える
2

プログラムをより慎重に進めてください。Sub1 の値はどこから来ていますか?

于 2009-03-06T23:28:01.333 に答える
1

ヒント: 静的スコープでは、初期化されていません。理由がわかりますか?

于 2009-03-06T23:29:50.177 に答える