-3

aレジスタ整数の値が上書きされない理由が不思議です:

#include <stdio.h>
#include <conio.h>

main()
{
    register int a=10;
    {
        register int a=30;
    }
    printf("%d",a);
    getch();
}

の値がa上書きされないのはなぜですか? 出力が表示され10ます。

4

2 に答える 2

1

新しいスコープで変数を再宣言します。2つのa:sは異なります。

次のことを試してください。

int main()
{
    register int a=10;
    {
       a=30;
    }
    printf("%d",a);
    getch();
}
于 2012-10-11T16:41:33.853 に答える
0

関数内にこれらの中かっこがあると、新しいネストされたブロックが作成されます。つまり、あなたの行:

register int a=30;

も呼び出される新しい変数を宣言していますa。printf に別の呼び出しを追加すると、それが起こっていることがわかります (プログラムを少し書き直して、不要なregisterキーワードを削除し、標準 C にするためにいくつかのことをクリーンアップしました)。

#include <stdio.h>

int main(void)
{
    int a = 10;
    {
        int a = 30;
        printf("%d\n", a);
    }
    printf("%d\n", a);
    return 0;
  }

このプログラムの出力は次のとおりです。

30
10

内部a( に設定されているもの30) は、他のローカル変数をシャドウすると言われています。必要に応じて、任意の数のネストを作成できます。たとえば、次のプログラム:

#include <stdio.h>

int main(void)
{
    int a = 10;
    {
        int a = 30;
        {
            int a = 40;
            printf("%d\n", a);
        }
        printf("%d\n", a);
    }
    printf("%d\n", a);
    return 0;
}

次の出力が生成されます。

40
30
10

の再宣言は、現在のスコープ/ブロック外の他のすべての宣言をa非表示にします。これが意味することは、元のプログラムが意味的に次のものと同等であることです。a

#include <stdio.h>

int main(void)
{
    int a = 10;
    printf("%d\n", a);
    return 0;
}

インナーaはセットしていたので未使用です。実際、いくつかの警告フラグをオンにすると、コンパイラーは何が起こっているかについての診断メッセージを出すことができます。ここで使用clangしました:

$ clang -Wunused-variable example.c -o example
example.c:7:9: warning: unused variable 'a' [-Wunused-variable]
    int a = 30;
        ^
1 warning generated.
于 2012-10-11T16:49:54.920 に答える