本文へスキップ
BecomeCoder

C言語コース · 第4章 関数 · レッスン17

変数のスコープ ― 見える範囲

ブラウザで完結

導入

変数には「どこから見えるか」という有効範囲(スコープ)があります。関数の中で作った変数と、外で作った変数の違いを押さえましょう。

説明

{ } の中(関数やループの内側)で宣言した変数は、その中だけで有効なローカル変数です。外からは見えません。

#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回呼ぶ。

実際に動かしてみよう

下のエディタにCを書いて「実行」を押すと、ブラウザ内のインタプリタで出力が表示されます。本文の例をそのまま試したり、書き換えたりしてみましょう(scanf を使う回は「標準入力」欄に値を入れてから実行します)。

C/C++ — ブラウザ内で実行

ブラウザ内でC/C++を動かす学習用インタプリタ(JSCPP)を読み込みます(入門向けのサブセットです)。
スクロールして表示された時点でも自動で読み込まれます。