導入
変数には「どこから見えるか」という有効範囲(スコープ)があります。関数の中で作った変数と、外で作った変数の違いを押さえましょう。
説明
{ } の中(関数やループの内側)で宣言した変数は、その中だけで有効なローカル変数です。外からは見えません。
#include <stdio.h>
void func(void) {
int x = 10; // func の中だけのローカル変数
printf("%d\n", x);
}
int main(void) {
func();
// printf("%d\n", x); // ← ここでは x は見えない(エラーになる)
int x = 99; // main の中の別の x(func の x とは無関係)
printf("%d\n", x);
return 0;
}
変数が「見える範囲」を図にすると、{ } の内側だけに閉じているのが分かります。
flowchart TB
subgraph G["プログラム全体(グローバル)"]
direction TB
gv["グローバル変数:どこからでも見える"]
subgraph F["func() の { }"]
fx["func の x:func の中だけ"]
end
subgraph M["main() の { }"]
mx["main の x:main の中だけ"]
end
end
すべての関数の外で宣言した変数はグローバル変数で、どの関数からも見えます。共有したいカウンタなどに使えますが、多用するとどこで変わったか追いにくくなるので控えめに使います。
#include <stdio.h>
int counter = 0; // グローバル変数
void count_up(void) {
counter++; // どの関数からも触れる
}
int main(void) {
count_up();
count_up();
printf("%d\n", counter); // 2
return 0;
}
やってみよう
count_up() を呼ぶ回数を変えて、counter の値がどうなるか確かめましょう。
演習
グローバル変数 int score = 0; を作り、void add_ten(void) の中で score += 10; するようにして、add_ten() を3回呼んだあとの score を表示してください(結果は 30)。
ヒント1を見る
関数の外で int score = 0;、void add_ten(void) { score += 10; }、main で3回呼ぶ。