変数が「どこからどこまで使えるか」をスコープと呼ぶ。
関数を使い始めると、変数のスコープを意識しないとバグの原因になる。
関数の中で宣言された変数はローカル変数(局所変数)と呼ぶ。
その関数の中だけで有効で、関数が終わると消える。
#include <stdio.h>
void show(void)
{
int x = 10; /* show の中だけで有効 */
printf("show の x = %d\n", x);
}
int main(void)
{
int x = 5; /* main の中だけで有効 */
printf("main の x = %d\n", x);
show();
printf("main の x = %d\n", x); /* show を呼んでも変わらない */
return 0;
}
main の x = 5 show の x = 10 main の x = 5
x と show の x は名前が同じでも別々の変数。関数の外(ファイルの先頭付近)で宣言された変数はグローバル変数(大域変数)と呼ぶ。
すべての関数からアクセスできる。
#include <stdio.h>
int count = 0; /* グローバル変数 */
void increment(void)
{
count++; /* グローバル変数を変更できる */
}
int main(void)
{
printf("count = %d\n", count); /* 0 */
increment();
printf("count = %d\n", count); /* 1 */
increment();
printf("count = %d\n", count); /* 2 */
return 0;
}
count = 0 count = 1 count = 2
同じ名前の変数がローカルとグローバルに存在する場合、
関数内ではローカル変数が優先される(グローバルは隠れる)。
#include <stdio.h>
int value = 100; /* グローバル */
int main(void)
{
int value = 50; /* ローカル(グローバルを隠す) */
printf("value = %d\n", value); /* 50 が表示される */
return 0;
}
value = 50
| ローカル変数 | グローバル変数 | |
|---|---|---|
| 宣言場所 | 関数の中 | 関数の外(ファイル先頭) |
| 有効範囲 | 宣言した関数内のみ | プログラム全体 |
| 生存期間 | 関数が実行される間だけ | プログラム全体 |
| 初期値 | 不定(初期化が必要) | 0 で自動初期化 |
| 推奨 | ✅ 基本はこちら | ⚠ 必要な場合のみ |
グローバル変数 count を使い、関数 call() を呼ぶたびに
「呼び出し回数: N」と表示するプログラムを作れ。main から3回呼ぶこと。
#include <stdio.h>
/* ここにグローバル変数を宣言する */
void call(void)
{
/* ここを書く */
}
int main(void)
{
call();
call();
call();
return 0;
}
#include <stdio.h>
int count = 0;
void call(void)
{
count++;
printf("呼び出し回数: %d\n", count);
}
int main(void)
{
call();
call();
call();
return 0;
}
Q1. 次のプログラムの出力として正しいものはどれか。
#include <stdio.h>
int num = 10;
void func(void)
{
int num = 5;
printf("A: %d\n", num);
}
int main(void)
{
printf("B: %d\n", num);
func();
printf("C: %d\n", num);
return 0;
}
| 実行箇所 | 参照する num | 出力 |
|---|---|---|
| main: printf("B: %d\n", num) | グローバル num = 10 | B: 10 |
| func: printf("A: %d\n", num) | ローカル num = 5 | A: 5 |
| main: printf("C: %d\n", num) | グローバル num = 10 | C: 10 |
正解:イ
main の printf("B:") と printf("C:") はグローバル num=10 を参照。
func 内では同名のローカル num=5 が優先される。
Q2. 次のプログラムの出力として正しいものはどれか。
#include <stdio.h>
void test(void)
{
int x = 2;
printf("x = %d\n", x);
}
int main(void)
{
int x = 5;
test();
printf("x = %d\n", x);
return 0;
}
正解:イ
test() の x と main の x は別物。test() を呼んでも main の x=5 は変わらない。
Q3. ローカル変数の説明として正しいものはどれか。
正解:ウ
ローカル変数はその関数内だけで有効。初期化されないと不定値(ゴミ値)になる点に注意。
Q4. グローバル変数の使用が推奨されない主な理由はどれか。
正解:イ
グローバル変数はどの関数からでも変更できるため、予期しない変更によるバグが追いにくくなる。