2

このプログラムの出力を(コンピューターで実行せずに)決定する必要があります。グローバル変数と静的変数がどのように連携するかについては、かなりよくわかりません。

#include <stdio.h>

void f(int d);

int a = 1, b = 2, c = 3, d = 4;

int main()
{
    int a = 5, c = 6;
    f(a);
    f(b);
    f(c);
    printf("%d %d %d %d\n",a,b,c,d);
    return 0;
}

void f(int d)
{
    static int a = 0;
    a = a + 7;
    b = a + d;
    c++;
    d--;
    printf("%d %d %d %d\n",a,b,c,d);
}
4

3 に答える 3

1

ローカル変数の定義は、常に同じ名前のグローバル変数を「非表示」にします。内側のスコープは常に外側のスコープよりも優先されます。一部のコンパイラは、変数が別の変数を「シャドウ」したときに警告を生成します。

于 2013-02-03T09:32:34.447 に答える
1

スコープ内で最も近い可視バインディングは、それ以降のバインディングをすべて非表示にします。したがって、mainすべての名前でローカル変数を参照し、ローカル変数(静的ではありますが、重要ではありません)fのみで、関数パラメーターを参照し、グローバル変数を参照します。adbc

キーワードを使用して、遠く離れた名前を限定的に再表示できますが、extern十分なローカルスコープがあれば、どこか深いところからは決して見えない変数をいつでも作成および非表示にできます。

于 2013-02-03T09:35:46.887 に答える
0

2 つの変数が同じ識別子で宣言されている場合、アクセスは最小のスコープを持つ変数を参照します。

C11 (n1570)、§ 6.2.1 識別子の範囲

識別子が同じ名前空間内の 2 つの異なるエンティティを指定する場合、スコープが重複する可能性があります。その場合、一方のエンティティのスコープ (内側のスコープ) は、もう一方のエンティティのスコープ (外側のスコープ) の前に厳密に終了します。内部スコープ内では、識別子は内部スコープで宣言されたエンティティを指定します。外側のスコープで宣言されたエンティティは、内側のスコープ内では非表示になります (表示されません)。

于 2013-02-03T09:41:14.350 に答える