第5講 プロシージャ(1)
第8話 変数のスコープ
前話の謎を解くためには、
変数のスコープの話をしなければなりません。
この話はなぜC言語がプログラム言語のキングオブキングになったかと関係します。
変数のスコープとは、変数の適用範囲であることを前に説明しました。
このことを説明するためにコードを次のように変更していただく必要があります。
Module Module1
Sub Main() '私は社長だ。
Dim a As Integer //変数aを宣言
a = 3
Console.WriteLine("a = {0:d}", a)
f()
Console.WriteLine("a = {0:d}", a)
End Sub
Sub f()
a = 5
End Sub
End Module
変更すると、
とaのところに赤い波線が付いてしまいますね。
そして、Ctrl+F5をすると、
とビルドエラーが発生します。
ビルドエラーが発生したときには、
いいえを選択して下さい。
選択すると、一番下に
とエラー原因が指摘されます。
Main()で
Dim a As Integer //変数aを宣言
とちゃんと宣言してあるのに、
aが定義されていないと出てきてしまいます。
そして、
右の方にエラーした文の番号がでいます。
つまり、
a = 5
に問題があるのだといっているわけです。
初心者の方は、箱の用途をちゃんと宣言して定義したはず!と納得できませんね。
実は、変数のスコープ(範囲)は関数内に限定されているのです。
つまり、aのスコープは
図の赤い}に限定されているのです。
エラーを解消するために、コードを次のように変更して下さい。
Module Module1
Sub Main() '私は社長だ。
Dim a As Integer '変数aの宣言
a = 3
Console.WriteLine("a = {0:d}", a)
f()
Console.WriteLine("a = {0:d}", a)
End Sub
Sub f()
Dim a As Integer '変数aの宣言
a = 5
End Sub
End Module
今度は赤い波線も消えてビルドエラーも発生しませんが、
実行結果は、
a = 3
a = 3
です。
どうして、
a = 5
が生きないのでしょうか。
理由はおわかりですよね。
そうです。スコープです。
スコープすなわち変数の適用範囲は基本的にプロシージャ内に限定されている!です。
同じ名称のaでも実は、別の箱です。
箱は社員専用の箱でして、
他の社員は使うことが原則として出来ないのです。
社長が用意した箱や社員が用意した箱は、
その用意した人専用の箱なのです。
前話で引数を使い値を渡しましたが、
実は箱そのものを渡したのではなく、
あくまで箱の中身の値を渡したのにすぎないのです。
基本的には箱は用意した社員専用ですし、
箱は渡せないのです。
絶対的な権限を持つ社長であるMain()でさえ、
社員の箱を勝手に使うことは出来ないのです。
スコープを関数内に限定した−−−これがC言語がキングオブキングになった最大の理由です。
そして、VBはこの素晴らし利点を学んだのです。
(しかも、基本的には他の社員が用意した箱は使えないはずなのに、
許可を与えて使用をさせる方法も考えたことが、
C言語がながらく愛されてきた理由なのです。
箱は渡せないのに、箱を使用することを可能にする魔法の方法を
C言語は備えているのです。
VBも基本的に同じです。
VBを小馬鹿にする人がいますが、
現在のBasicは決してC言語に劣らないのです。)
どうして、スコープを関数内に限定した、
つまり、箱を社員専用のものにしたことが、
C言語の成功の素になったのはどうしてでしょうか。
そして、なぜVBは真似たのでしょうか。