第5講 関数の学習
第3話 関数の独立性

関数には非常に重要な性質があります。
それは関数同士が独立しているということです。
関数はパーツであり、
プログラミングはそのパーツの単純結合であると第1話でいいましが、
その意味が今回理解できると思います。
まず、次のようにコーティングして実行してみましょう。
#include<iostream>
using namespace std;
int f();
void main(){
   int a;
}
int f(){
   return(2*a);
}
すると、
..\a.cpp(14) : error C2065: 'a' : 定義されていない識別子です。
となりエラーしてしまします。
もちろん、タイピングミスではありません。
aが定義されていないというけど、
ちゃんと
   int a;
でaを定義(宣言)しているはずなの・・・
と疑問に思いますよね。
実は、変数は関数の中でしか有効でないのです。
v
ですから、
関数fの中では定義されていないということになってしまいます。
変数の有効な範囲をスコープというのだ、ということは前に一度触れていますが、
スコープが関数の範囲内に限定されています。
変数のスコープが関数の範囲内に限定されているとき、
ローカル変数といいます。
基本的に、C言語やC++で使う変数はローカル変数なのです。
不便なようですが、
C言語やパスカルなどの言語がBASICに勝っていた点は、
関数の独立性という点なのです。
BASICにおいては、
各パーツは独立していなくて、
変数の値があちらこちらのパーツで書き換えられてしまいます。
ということは、BASICのプログラムでは、
常に全体を見ていないとプログラミングできないということです。
それに対して、
変数名が同一であっても他の関数で値が書き換えられてしまう心配がない
C言語(C++)プログラミングでは、各パーツの開発のみに専念すれば良いのです。
コードを次のように変更して下さい。
#include<iostream>
using namespace std;
void f();
void main(){
   int a;
   a=5;
   cout<<"aの値は"<<a<<endl;
   f();
   cout<<"aの値は"<<a<<endl;
}
void f(){
   int a;
   a=3;
}
今度はエラーせず、
x
と表示されました。
   cout<<"aの値は"<<a<<endl;
   f();
   cout<<"aの値は"<<a<<endl;
間にf(); があり、関数fではa=3; を実行しているにもかかわらず、
aの値は5のまま変わらなかったことが分かります。
aがローカル変数であったために、
変数名が同一であっても他の関数で値が書き換えられることはないのです。
もちろん、
C言語やC++にもすべての関数で
有効なグローバル変数も用意されています。
次のようにコードを変更しましょう。
#include<iostream>
using namespace std;
void f();
int a;
void main(){
   a=5;
   cout<<"aの値は"<<a<<endl;
   f();
   cout<<"aの値は"<<a<<endl;
}
void f(){
   a=3;
}
すると、実行結果は
z
となり、aの値が書き換えられていることが分かります。
y
冒頭で変数の宣言をすると、
その変数はグローバル変数になります。
ですが、C言語やC++では、
基本的にはスコープ(範囲)が関数の中に限定されているローカル変数
を使ってプログラミングしていきます。
BASICの変数は、すべてグローバル変数でしたし、
GOTO文であちらこちらに飛びましたので、
各パーツが脳細胞のように複雑に連結していました。
脳細胞はシナプスを通して、
他の脳細胞と複雑に結合しています。
GOTO文であちらこちらに飛びますので、
BASICプログラミングは、スパゲティ・プログラムと揶揄されました。
それに対して、C言語やC++では関数同士は出口と入り口の
2カ所(下図の青い線と赤い線、↔と考えれば1カ所)
y
でしか繋がっていない単純結合です。
確かに、関数を使うときには、
他の場所に飛んでいっているのですが、
戻ってくる場所が同一の場所です。
それに対してスパゲティ・プログラムであるBASICプログラムでは、
c
(赤い矢印は、GOTO文での跳躍、紫の矢印は1行1行の進行を表す。
また、枠はそれぞれのパーツを示している。)
同じ場所には戻らず、別の場所に飛んで行ってしまいます。
C言語やC++の関数の結合は、
プラモデルのパーツのように単純に連結しているだけです。
プラモデルの部品は、せいぜい数カ所で他の部品と繋がっているだけです。
行って戻ってくることを↔と考えれば1カ所の結合であり、
プラモデルの部品より、関数同士は単純に繋がっているということになります。

独立部品を単純に結合させていくプログラミングを
構造化プログラミングといいますが、
Cやパスカルなどの言語では、
構造化プログラミングが徹底していたのです。
構造化プログラミングの最大の利点は、
プログラミンが分かりやすいものになり、
さらに、分業によるプログラム共同開発ができる点です。

ただ、BASICの名誉のために言っておきますと、
Visual Basicとなった現在、
C言語やC++に負けない構造化プログラミングができるようになっています。



第2話へ 第4話へ

a

魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ