私たちはすでにC関数をある程度理解しています。今回は、これまで学習した関数に関する知識をまとめます。私たちは前回、次のようなサンプルコードを目にしました。
#include <stdio.h>
int AddTest(int, int); ===> 関数プロトタイプ(関数仕様の宣言)
int main()
{
int getVal; ===> 「整数の和」を「宣言」
const char* ch = "I don't know anything about programming!\n";
printf (ch);
getVal = AddTest(2, 3);
printf ("%d\n", getVal);
return 0;
}
int AddTest (int a, int b) ===> 整数の和を返すと「宣言」
{
int c;
c = 0;
c = a + b;
return c; ===> 「宣言通り」に整数型の値を返す
}
このサンプルコードは、main、printf、AddTestという3つの関数で構成される、きわめて単純なものです。しかし、このサンプルコードは、私たちに次のことを教えてくれています。
・関数は宣言した値を受け取り、宣言した値を返す。
・関数は名前を持っている。
・関数名からCプログラムの機能概要が分かる。
・関数名からCプログラム開発者の考え方が分かる。
・Cプログラムは複数の関数で構成される。
・コンパイラは関数に潜んでいる論理的な矛盾を検出する。
・コンパイラは関数と関数の間の関係に潜んでいる論理的な矛盾を検出する。
・コンパイラは「罪深く、かつ、弱い」人間が作り上げたアプリケーションプログラムである。
このリストを眺めてみると、Cプログラムの「単純さ」が感じられます。しかし、「単純さ」は、理解が容易であり、ミスの入り込む隙間があまりないともいえます。その上、「単純さ」は「簡潔さ」に通じることもあり、簡単に壊れたりしません。Cは電子回路の表現に向いている、つまり、Cはシステム記述言語といわれますが、おそらく、Cが持つ「単純さ」や「簡潔さ」がそれを可能にしているのでしょう。Cをいったん習得すると、多くの人は、"もう手放せない"といいます。
関数の定義をもう一度見ておきましょう。
"関数とは、要求元から値を受け取り、要求された処理を行った上で、その結果を要求元に返す"
この定義はいつ見ても、たいへん分かりやすいものです。感動すら覚えます。数学や物理学の数式や公式がそのままソフトウェアの世界に駆け込んできた感じです。この定義はもちろん間違いではありません。しかし私たちは、インターネットへの常時接続時代に生きています。国際標準化委員会で承認された新しい技術仕様書が時々刻々公開される時代に生きています。この関数定義は、情報が日夜の区別なく国境を越える時代を生きる私たちに、時代にふさわしい表現力を与えてくれているとはいえません。私たちの時代の要求は、数式を一つひとつ、「愚直に、かつ、時間をかけて」じっくり並べる所作を許してくれません。C++の設計者であるBjarne Stroustrup氏は、関数を次のように表現しています。
"C関数とは、プログラムを抽象化するための道具である"
抽象化とは、考えていることを分かりやすく表現することです。C++から見た場合、Cには、プログラムを分かりやすく表現する道具として関数が用意されているというわけです。これは表現を変えると、自分の考えを分かりやすいCプログラムとして表現する場合、使える表現道具は関数以外にはない、ということになります。C++は、クラスという概念を導入し、表現力を劇的に向上させています。