月ノ書

【C言語】スコープとは?ローカル変数とグローバル変数の違いと正しい使い分けを徹底解説

この記事でわかること

・スコープの意味と基本ルール
・ローカル変数とグローバル変数の違い
・同じ名前の変数を使ったときの挙動
・グローバル変数が危険と言われる理由
・実務で安全に変数を管理する考え方

スコープとは

スコープとは、変数が どこで使えるか(有効範囲) を表す概念です
C言語では「変数を宣言した場所」によって、その変数が使える範囲が決まります

スコープを正しく理解していないと

・コンパイルエラーが出る
・意図しない値が使われる
・バグの原因が分からなくなる

といった問題が起こりやすくなります

C言語のスコープの種類

C言語では、代表的に次の2種類のスコープがあります

種類説明宣言場所使用できる範囲
ローカル変数関数内で宣言する変数関数やブロック内そのブロック内のみ
グローバル変数関数外で宣言する変数ファイル先頭などプログラム全体

ローカル変数

関数の中で宣言した変数は、その関数の中でしか使えません
このような変数を ローカル変数 と呼びますは、その関数の中でしか使えません。そのような変数をローカル変数といいます

#include <stdio.h>

void hello() {
    int x = 10;    // ローカル変数
    printf("hello内: x = %d\n", x);
}

int main(void) {
    int y = 20;    // ローカル変数
    printf("main内: y = %d\n", y);

    hello();

    // printf("%d", x);    // エラー helloのxは見えない
    return 0;
}
main内: y = 20
hello内: x = 10

x は hello の中でしか使えず、y は main の中でしか使えません
これがスコープによる制限です

グローバル変数

関数の外で宣言した変数は、どの関数からでも使えます
これを グローバル変数 と呼びます

#include <stdio.h>

int g = 100;    // グローバル変数

void func() {
    printf("funcから g = %d\n", g);
}

int main(void) {
    printf("mainから g = %d\n", g);
    func();
    return 0;
}
mainから g = 100
funcから g = 100

どの関数からも同じ g にアクセスできています

同じ名前の変数に注意

ローカル変数とグローバル変数で 同じ名前 を使うと、ローカル変数が優先されます

#include <stdio.h>

int num = 10;    // グローバル変数

int main(void) {
    int num = 20;    // ローカル変数
    printf("num = %d\n", num);
    return 0;
}
num = 20

この場合

という挙動になります
初心者が混乱しやすいポイントなので要注意です

なぜローカルとグローバルを使い分けるのか

「全部グローバル変数にすれば楽では?」と思う人はとても多いです
ですが、グローバル変数には大きなデメリットがあります

グローバル変数のデメリット

処理の流れが分かりにくくなる

どこからでも変更できるため

値を書き換えたのか分からなくなりがちです

デバッグが一気に地獄になります

名前の衝突が起きやすい

ファイルが増えると

といった事故が起こりやすくなります

再利用性が下がる

関数が

「外にあるグローバル変数に依存している」

状態になるため
その関数だけを別プロジェクトに持っていくのが難しくなります

ローカル変数を使うメリット

ローカル変数は

という特徴があります

結果として

という良いことづくめの状態になります

まとめ

学習進捗

0
Would love your thoughts, please comment.x