第5講 関数(1)
第8話 変数のスコープ
前話の謎を解くためには、
変数のスコープの話をしなければなりません。
この話はなぜC言語がプログラム言語のキングオブキングになったかと関係します。
変数のスコープとは、変数の適用範囲であることを前に説明しました。
このことを説明するためにコードを次のように変更していただく必要があります。
#include<stdio.h> //prinf()を使えるようにするためにインクルード
void f();
int main() {
int a; //変数aを定義
a = 3;
printf("a=%d\n", a);
f();
printf("a=%d\n", a);
}
void f() {
a = 5;
}
変更すると、
とaのところに赤い波線が付いてしまいますね。
そして、Ctrl+F5をすると、
とビルドエラーが発生します。
ビルドエラーが発せいたときには、
いいえを選択して下さい。
選択すると、一番下に
とエラー原因が指摘されます。
main()で
int a; //変数aを定義
とちゃんと定義してあるのに、
aが定義されていないと出てきてしまいます。
そして、
右の方にエラーした文の番号がでいます。
つまり、
a = 5;
に問題があるのだといっているわけです。
初心者の方は、箱の用途をちゃんと宣言して定義したはず!と納得できませんね。
実は、変数のスコープ(範囲)は関数内に限定されているのです。
つまり、aのスコープは
図の赤い}に限定されているのです。
エラーを解消するために、コードを次のように変更して下さい。
#include<stdio.h> //prinf()を使えるようにするためにインクルード
void f(); //s:初項 k:交差 m:末項
int main() {
int a; //変数aを定義
a = 3;
printf("a=%d\n", a);
f();
printf("a=%d\n", a);
}
void f() {
int a; //変数aを定義
a = 5;
}
今度は赤い波線も消えてビルドエラーも発生しませんが、
実行結果は、
a=3
a=3
です。
どうして、
a = 5;
が生きないのでしょうか。
理由はおわかりですよね。
そうです。スコープです。
スコープすなわち変数の適用範囲は基本的に関数内に限定されている!です。
同じ名称のaでも実は、別の箱です。
箱は社員専用の箱でして、
他の社員は使うことが原則として出来ないのです。
社長が用意した箱や社員が用意した箱は、
その用意した人専用の箱なのです。
前話で引数を使い値を渡しましたが、
実は箱そのものを渡したのではなく、
あくまで箱の中身の値を渡したのにすぎないのです。
基本的には箱は用意した社員専用ですし、
箱は渡せないのです。
絶対的な権限を持つ社長であるmain()でさえ、
社員の箱を勝手に使うことは出来ないのです。
スコープを関数内に限定した−−−これがC言語がキングオブキングになった最大の理由です。
(しかも、基本的には他の社員が用意した箱は使えないはずなのに、
許可を与えて使用をさせる方法も考えたことが、
C言語がながらく愛されてきた理由なのです。
箱は渡せないのに、箱を使用することを可能にする魔法の方法を
C言語は備えているのです。
魔法を使うにはポインタが必要です。
ですから、第7話までお待ちいただく必要があります。)
どうして、スコープを関数内に限定した、
つまり、箱を社員専用のものにしたことが、
C言語の成功の素になったのでしょうか。