【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 = 10x は 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この場合
- main 内ではローカル変数 num が使われる
- グローバル変数 num は完全に隠れる
という挙動になります
初心者が混乱しやすいポイントなので要注意です
なぜローカルとグローバルを使い分けるのか
「全部グローバル変数にすれば楽では?」と思う人はとても多いです
ですが、グローバル変数には大きなデメリットがあります
グローバル変数のデメリット
処理の流れが分かりにくくなる
どこからでも変更できるため
- いつ
- どこで
- 誰が
値を書き換えたのか分からなくなりがちです
デバッグが一気に地獄になります
名前の衝突が起きやすい
ファイルが増えると
- 同じ変数名をうっかり使う
- 意図せず値が上書きされる
といった事故が起こりやすくなります
再利用性が下がる
関数が
「外にあるグローバル変数に依存している」
状態になるため
その関数だけを別プロジェクトに持っていくのが難しくなります
ローカル変数を使うメリット
ローカル変数は
- 必要な場所でだけ使える
- 外から勝手に書き換えられない
- 関数の責任範囲が明確になる
という特徴があります
結果として
- バグが減る
- 修正が楽になる
- コードの見通しが良くなる
という良いことづくめの状態になります
まとめ
- スコープは変数の有効範囲を決める仕組み
- ローカル変数は関数やブロック内だけで使える
- グローバル変数はどこからでも使えるが危険が多い
- 同じ名前の場合はローカル変数が優先される
- 基本はローカル変数を使い、必要な場合のみグローバルを使う