すべてのプログラムでお約束のただ単に Hello World! と画面に表示するだけの機能のプログラムを元にCの基本的なことを説明していきたいと思います。簡単そうですがCの場合これだけでも結構話題が付きませんのでしっかりと基礎を押さえてください。
#include <stdio.h> /* メイン関数 */ int main() { /* 文字の表示 */ printf("Hello World!\n"); /* 終了 */ return 0; }
まずは文法的な話から入りたいのですが、それにはまずC言語の処理を知っている必要があります。実はC言語のソースはいきなりCコンパイラによってコンパイルされるわけではなく、プリプロセッサと言うプログラムによってその名の通り前処理されます。でもって、プリプロセッサに対する文法とコンパイラに対する文法が違いますので要注意です。まずはプリプロセッサの説明から
プリプロセッサが何をするかと言うと主に文字列処理です。上のソースを見ていただければ大体想像が付くと思いますが /* と */ で囲まれた部分はコメントです。これはプリプロセッサによってコンパイラに渡される前に取り除かれます。
また、# で始める行はプリプロセッサに対する命令です。プログラム上には include と言うプリプロセッサ命令があり、stdio.h と言うファイルの中身がこの位置に展開(インクルード)されます。ここではインクルードするファイルの中身までは説明しませんが、後に出てくる printf と言う関数を利用するための宣言が入っているからとだけ覚えておいてください。プログラムの中で利用する関数に応じて取り込むファイルが変わってきます。
プリプロセッサで処理された後はコンパイラによってコンパイルされます。コンパイラが解析する際の文法はプリプロセッサと違い行と言う概念がありません。空白、タブ、改行はすべて空白とみなされます。よって極端な話以下のように書いてもコンパイラにとっては同じです。
#include <stdio.h> int main() { printf( "Hello World\n" ) ; return 0; }
まあ、邪悪Cコードコンテストなどと言うわざと読みにくいコードを書くコンテストもあるぐらいですから、Cの言語仕様は結構いい加減です。タブや改行を適当なところで使って読みやすく書きましょう。
C言語は基本的にすべて関数です。関数を作り、関数を使いながらプログラミングを行います。関数の概念自体は数学の関数とよく似ています。たとえば数学の関数で
f(x, y) = 2x + yというものがあったとしますと、f(2, 3) は 2 * 2 + 3 = 7 ですよね。このときの流れをC言語風に言うと、f(2, 3)の 2 と 3 が関数 f の引数(ひきすう)であり、関数 f が計算され戻り値として 7 が戻されたと言えます。
具体的にCの関数はどうなるかと言うと
戻り値の型 関数名(引数リスト, ...) { −処理− return 戻り値; }と言うようになります。今回のプログラムでは main と言う名前の関数が引数なしで戻り値に int型(整数値)を戻すように書かれています。
関数を作ったら当然その中にプログラムを書いて関数内で行われる処理を書いていくわけですが、その文法は簡単ですで「命令を書いて ;(セミコロン)」 です。; は命令の後ろに必ずつけます。Hello Worldでは main 関数の中で、printf 関数を呼び出す命令と、戻り値を渡して関数を終了する return 命令の2つがありますが、どちらも ; で終わっていますね。; は命令と命令の区切りではなく、命令の後ろに必ずつけるものですからPascalの経験のある方は気をつけましょう。
プログラマは自由に名前を決めて関数を作ることができるのですが、特に main と言う名前だけは特別で、プログラムが実行されるとmain 関数が実行されます。つまりプログラムはmain関数で始まり、main 関数が終了するとプログラムも終了します。このとき main 関数の戻り値がプログラムの終了コードとなります。一般に0が正常終了で大きい数値を渡すほど深刻なエラーで終了したことを示します。
しかしプログラムの終了方法にはもうひとつあって、それは exit と言う標準関数を呼び出すことです。この場合はexit関数の引数にプログラムの終了コードを引数として渡します。exit の方はどこでも呼び出せますので何らかのエラーが発生したときに呼ばれることが多いです。
まとめと言うことでもう一度全体を見渡してみます。
まず、プログラムの中で printf標準関数を利用するので冒頭で stdio.h と言う標準入出力(Standard Input Outputの略だと思う)系の関数を定義したファイルを読み込んでいます。そしてプログラムは main 関数から実行され、printf関数によって文字が出力され、return 命令によってmain関数が0を戻すことによりプログラムは終了コード0で終了します(正常終了)。
こんな感じでいいのかな。でわまた次回