第8章 C言語の関数 ~ 関数の作り方とモジュール分け ~
休憩室
今回は、変数の宣言と関数の宣言の大切さです。
C言語(その他、多くのプログラム言語)では必要な変数は全て、
事前に宣言して用意しておかなければいけません。
しかし、BASIC言語や、いくつかのスクリプト言語
(プログラム言語とはちょっと違う分類になります)などの
インタプリタ系言語(講義で習ってなければ、質問して下さい)では、
変数宣言が必要ありません
(注23)。
これだけを聞くと皆さんは、その方が便利だと感じるかもしれません。
しかし、変数宣言がないということは、実はとても危険なのです。
宣言がないということは、最初に変数名が使われた時に、
変数の箱が用意されるということです。それは次のようなことを引き起こします。
例:Perlというスクリプト言語を用いて、最終的に変数 count を15に設定したい場合
$count = 10;
※ここで用意される
$Count = $count + 5;
※ここでも、新しく用意されてしまう
つまり、countという変数がすでに用意されていても、Countと打ち間違えてしまったら、
全く別の変数があらたに出てきたと認識されてしまうのです。
何しろ、このプログラムを解析するインタプリタと呼ばれるプログラムは、
countとCountが似ているものだとは理解できないのです。
これがC言語だと、
int count;
count = 10;
Count = count + 5;
※ここでコンパイルエラーとなります。
これならば、int Count; を宣言でもしない限り、コンパイルが正常に通ることはないのです。
少し面倒くさいと感じるかもしれませんが、変数宣言のある言語の方が安全なのです。
変数宣言のない言語は、文法が簡単であることが多いので、
ちょっとしたプログラムを作る場合はたいへん便利です。
しかし、大規模なプログラムを作る場合には、危険だと言えましょう。
かくいう私も、今(96年10月)やってる仕事で
perlというスクリプト言語を使って仕事をしていますが、
$inputを一個所だけ$intputと書いてしまい、しばらくハマってしまいました。
次に関数の宣言についてです。今回習ったばかりですが、理解できましたか?
実は関数の宣言は、なくてもコンパイルできます(警告までしか出ません)。
しかし、それが危険だというのは、注21で述べています。
それでは、関数の宣言がないと一体どういう具合に危険なのでしょうか?
次のプログラムを見てください。
-- リスト22--
#include <stdio.h>
#include <string.h>
void main()
{
char hensuu1[10];
int hensuu2;
MyFunction( hensuu1, hensuu2 );
}
int MyFunction( int hikisuu1, char *hikisuu2 )
{
hikisuu1 = 10;
strcpy(hikisuu2, "ここが、とくに危険です!!");
}
わかりづらい変数名にしたために、char 配列の変数を int 型の引数に、
int 型の変数を char 配列の引数に渡してしまっていますね。
これはたいへん危険です(Windows95の場合は、システム全体が停止するかもしれません)。
これだけ危険なプログラムなのに、関数宣言がないことによって、
コンパイルが通ってしまいます(関数の戻り値の型が、int 型なのがミソです)。
皆さんは、コンパイルが通りさえすれば、
プログラムは正しいのだと思っていたかもしれません。
しかし、ご覧のようにそんなことはありません。
ですから、コンパイラはなるべく細かいチェックをしてくれるものがいいのです。
皆さんが使ってるコンパイラも、設定によってはコンパイルを
もっと厳しくすることができます。コンパイルエラーは、
本来たいへんありがたいものなのです。少しくらいエラーが出てきたぐらいで、
腹を立ててはいけないのです。
最後に、以下の関数宣言を、さっきのプログラムに追加してください。
int MyFunction( int hikisuu1, char *hikisuu2 );
どうなりましたか?ありがたいコンパイルエラーがいっぱい出てきましたか?
そのエラーを修正したプログラムが、本来の正しいプログラムなのです。