a
レジスタ整数の値が上書きされない理由が不思議です:
#include <stdio.h>
#include <conio.h>
main()
{
register int a=10;
{
register int a=30;
}
printf("%d",a);
getch();
}
の値がa
上書きされないのはなぜですか? 出力が表示され10
ます。
新しいスコープで変数を再宣言します。2つのa:sは異なります。
次のことを試してください。
int main()
{
register int a=10;
{
a=30;
}
printf("%d",a);
getch();
}
関数内にこれらの中かっこがあると、新しいネストされたブロックが作成されます。つまり、あなたの行:
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.