第8講 関数の学習その2  
第1話 関数の独立性

第8講では、再び関数の学習をします。
何故かと申しますと、関数を理解することが構造化プログラミングを理解する鍵になるからです。
新しいプロジェクト作り、次のようにコーティングしてみましょう。
#include<iostream>
using namespace std;
using namespace System;
void f();
void g();
int main(){
   f();
   g();
}
void f(){
   int i;
   i=2;
}
void g(){
   cout<<i<<endl;
}

このコードは一見問題なさそうですが、Ctrl+F5でビルドしてみると、

エラー 1 error C2065: 'i' : 定義されていない識別子です。 C:\VC++2010\d6\g\g\a.cpp 15

とエラーします。
iの宣言は関数f()で行っているのになぜ?
実は、C言語においては変数は、関数の中でのみ有効なのです。
ですから、関数gにおいては、変数の宣言がされていないので、定義されていない識別子ですとなってしまうのです。
iを使いたいなら、関数gにおいても宣言しなければなりません。
そこで、コード次ぎように変更すれば問題は解消するでしょうか。
#include<iostream>
using namespace std;
using namespace System;
void f();
void g();
int main(){
   f();
   g();
}
void f(){
   int i;
   i=2;
}
void g(){
   int i;
   cout<<i<<endl;
}

確かに、ビルドエラーは解消されましたが、
実行結果は入門と2ではなく0となってしまいました。
さらに、コードを次のように変更してください。
#include<iostream>
using namespace std;
using namespace System;
void f();
void g();
int main(){
   f();
   g();
}
void f(){
   int i;
   i=2;
   cout<<i<<endl;
}
void g(){
   int i;
   cout<<i<<endl;
}
C言語fで確かにiに2が代入されていることがわかります。
ところが、gの方では0と表示されてしまいます。
変数は、デフォルトの状態(最初の状態)は0と決められているのです。
さて、さらにコード次のように変更しましょう。
#include<iostream>
using namespace std;
using namespace System;
void f();
void g();
int main(){
   f();
   g();
   f();
}
void f(){
   int i;
   cout<<i<<endl;
}
void g(){
   int i;
   i=1;
}
初心者
gで1を代入しても、iの値は0のままです。
これが関数の独立性です。
つまり、同じ変数名であってもその変数の値は、
他の関数で書き換えられる心配はないのです。
初期のBASICにおいては、サブプログラム(関数に相当するもの)は存在していましたが、
変数名が同じだと、他のサブプログラムで値を書き換えられてしまう心配があるのです。
結局、BASICのプログラムは常に全体を見ていないとプログラムが組めないのです。
しかも、BASICには悪しきGOTO文というのがあり、あちらこちらに飛び、
変数もあちらこちらで書き換えられてしまうため、見通しの悪いプログラムになってしまいました。
スパゲティプログラムと揶揄された所以です。

それに対して、C言語の場合は最初から構造化プログラミングの思想が徹底していました。
これがプログラム言語の王者になっていった最大の理由です。
C++やVC++と拡張されいった現在でもC言語を愛好している人はたくさんいます。
それに、やはりC++とVC++の根冠部分はC言語にあります。
C言語の理解なしに、C++やVC++の理解はあり得ません。
関数が独立しているため、プログラマーはその関数のみの開発に専念できます。
コーティングを次のようにしてみましょう。
#include<iostream>
using namespace std;
using namespace System;
void f();
void g();
void h();
int main(){
   f();
   g();
   h();
}
void f(){
   int i;
   i=2;
   cout<<i<<endl;
}
void g(){
   int i;
   i=1;
   cout<<i<<endl;
}
void h(){
   int i;
   i=3;
   cout<<i<<endl;
}
基礎
つまり、パーツを分業で開発することもできます。
そして、このパーツをプラモデルの部品を組み立てるようにmainに置いて組み立てる
・・・これが構造化プログラミングなのです。

関数は、他から独立しているのです。だから、関数の独立性です。

第7講第11話へ 第2話へ


戻る


VB講義へ
VB講義基礎へ

vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)