くぼっちのC言語入門

3. さいしょのプログラム

C 言語を勉強する場合、さいしょに作るプログラムは、 「Hello, world.」と画面に表示するプログラムでなければなりません。 なぜって、これはそういうことになっているのです (ほんとうは、リッチーとカーニハンに敬意を表して、ということです)。


プログラム1
#include <stdio.h>
main(){
    printf("Hello, world.\n");
}

このプログラムは、すでに実行しましたね。今回は、 このプログラムの解説から始めます。

フリーフォーマット

まずは、ソースの書き方の流儀から。C は、フリーフォーマット といって、ソースの書き方が非常に自由で、 空白や改行を好きなように入れることができます (ただし、「#」で始まる行は例外で、 きちんと行の頭に「#」が来るように書かないといけません。それから、 もちろん、ひとつの単語を空白や改行で分割してはいけません)。たとえば、
プログラム2
#include <stdio.h>
     main   
  (                   ){printf
(
            "Hello, world.\n" 
                 );}

このプログラムも、さっきのプログラムと同じ動作をします。 しかし、こんなプログラムは見にくいですね。 見やすく書く習慣をつけましょう。

main 関数

プログラムは、main というところから実行されます。 したがって、C プログラムには main が必要です。main の後の 「( )」は、main というのが関数であるということを表しています。 関数とはなにかというのは以降の話題としますが、とりあえずいまは、 C のプログラムは関数のあつまりで構成されているのだ、 と考えてください。

関数の中身は、「{}」の中に書かれます。 その中には、printf というのがあって、次には「(」がありますね。 勘のいい人なら気づいたかも知れませんが、次に「(」が来ることから、 printf というのも関数だ、ということがわかります。 しかし、printf 関数が main 関数と違う部分もあります。 まず、「( )」の中が空っぽではない、という違いがありますが、 これは、printf 関数に対して指示を与えているわけです。 この詳細については、あとで書きます。

main 以外の関数

しかし、printf 関数と main 関数には、 この違いよりももっと重要な違いがあります。 それは、main( ) のあとには「{」と「}」があるのに対し、 printf( ) のあとにはそれがない、ということです。 これは、main 関数の中身は自分で書かなければならないが、 +printf 関数の中身は最初から用意されているので、 たんにそれを使うだけでよいということを示しています。 コンパイラには、このような関数が多数入っています。 LSI-C の場合には、マニュアル LSIC86.MAN の第 9 章 (4500 行目以降) に、関数などの解説がアルファベット順に載せられています。

#include

さて、C には printf という関数がもとから用意されていると書きましたが、 実際に使うには、「これから printf を使うよ」という宣言が必要です。 それが 1 行目の「#include <stdio.h>」です。これは、 「stdio.h というファイルを読み込め」という意味で、 stdio.h というファイルは C:\LC\INCLUDE の中にあります。 ちょっと覗いてみましょう。

int printf(const char *, ...);
というふうなぐあいに書いてある行がありますね。これが、 printf の宣言です。これをプロトタイプ宣言といいます。 いまは意味が分からなくてもいいです。

printf のプロトタイプ宣言は、stdio.h にありますが、 ほかの関数のプロトタイプ宣言は、どこにあるのでしょうか。 これは、マニュアル LSIC86.MAN に載っています。 printf の説明は LSIC86.MAN の 13272 行目にあります。

C はシンプルな言語だ

さて、なぜプロトタイプ宣言が必要なんでしょうか。 これは、C という言語の設計思想に関わる話です。 C は、言語仕様そのものは非常にシンプルにできています。 C そのものの言語仕様の中には、計算機能、関数を使うという機能、 などが必要最小限のものとして含まれていますが、 画面に表示する機能、ファイルの読み書きをする機能、 などは含まれていません

ところで、C には、自分で関数を作って、 それをライブラリにまとめあげて、 いつでも使える形に置いておく、という機能があります (このへん、分かってる人からはクレームがつく言い方かもしれませんが、 まずはこういう理解でいいと思います)。 そして、printf などの関数は、 このライブラリの形で供給されるのです。

つまり、C コンパイラ自身は printf という関数を知らないのです。 そこで、printf とはどんな関数か、 ということを C コンパイラに知らせるために、 プロトタイプ宣言が必要なのです。

printf の ( ) の中身

関数の ( ) の中には、関数に渡すデータ (パラメータ) を入れます。 printf というのは画面に文字を表示するための関数なので、 画面に表示したい文字を持ってきて、「printf さん、 この文字を表示してください」と頼むわけです。 「Hello, world.」はそのまま表示されますが、 「\n」だけが特別です。これは、「改行」を意味します。 このほかにも、「\」プラス 1 文字で特別な意味を持つ表現がいくつかあります。

また、「%」プラス 1 文字、という表現も特別な意味を持ちます。 これらについては、ちょっとずつ書いていく予定です。

なお、関数に渡すデータ (パラメータ) のことを、 引数 (ひきすう)といいます。

; (セミコロン)

printf( ) の後に、「;」という記号が書かれています。 文や式を書いた後にはこれが必要です。というのは、 C はフリーフォーマットなので、これがないと、 文や式の区切りがどこか分からないからです。

やってみましょう

プログラムができるようになるには、 自分でいろいろ体験してみるのが近道です。


4. 計算してみよう(1)

2. コンパイラってなに

「くぼっちのC言語入門」表紙へ

久保田智広ホームページに戻る