前回は本当に何も行わないプログラムを書いてみました。つまらないかもしれませんが、ここを疎かにすると大切なことを見落としてしまいます。今回は、その“何も行わないプログラム”を徹底的に詳しく説明したいと思います。

まずはおさらいからです。

これが前回書いた“何も行わないプログラム”ですね。行数にしてわずか4行です。今回はこのプログラムについて徹底的に解説してみることにします。

この何も行わないプログラムは、“main”という名前の「関数」だけを定義したものです。「関数」というのはC言語のプログラムの基本的な単位です。C言語では、「関数」をいくつも定義することでプログラムを作っていきます。

「関数」の中でも“main”という名前のものは特別な意味があります。C言語のプログラムは、必ず“main”という名前の「関数」から始める決まりになっています。ですから、C言語のプログラムには必ず“main”という「関数」をひとつ定義しなければなりません。“main”がなければプログラムとして成立しませんし、“main”が複数あってもいけません[1]

「関数」の最初の部分では、その関数がどんな名前で、どんな値を受け取って、どんな値を返すのかを宣言しています。今回の場合であれば、“main”という名前で、どんな値も受け取らず、int型の値を返すことを表しています。

いきなりいろんな言葉が出てきましたね。ひとつずつ順に説明していきます。mainの後ろに括弧がありますが、ここにはどんな値を受け取るかを書くところです。今回は“void”と書いていますね。“void”というのは何もないことを意味しています。mainの前には“int”と書いていますね。これがint型の値を返すという意味です。

 C言語で扱う値には、必ず何らかの「型」があります。int型というのもそうした「型」のひとつです。“int”というのは“integer”を略したもので整数を意味しています。整数は0, 1, 2, 3, …という1刻みの数ですね。正しくはプラスだけでなくマイナスもありますので、…, -3, -2, -1, 0, 1, 2, 3, …ということになります。ただし、数学では、整数はマイナス無限大からプラス無限大の範囲になりますが、コンピュータでは有限の範囲しか扱うことができませんので、上限も下限も制限があります[2]

C言語では、intとmainのように、続けてintmainと書くと別の意味になってしまうのを防ぐために空白文字を使います。正確には空白類といって、空白文字以外にもタブや改行を使うこともできます。空白類は何かひとつ入っていれば、あとはどれだけ入っていても、具体的な文字が何であってもかまいません。たとえば、次のような書き方もできます。

プログラミング言語によっては、改行したり、行頭に空白文字やタブを入れて字下げしたりすると、文法上の意味が変わってしまうものもあります。C言語ではそういうことはなく、改行も空白文字もタブも、単なる空白類にすぎません。

さて、ここまでの説明は、「関数」がどんな名前で、どんな値を受け取って、どんな値を返すかという形式的な話でした。実際に「関数」がどんな動きをするかは、そのあとの波括弧で囲んだ部分で定義します。

今回の何も行わないプログラムでは、実際の内容は return 0; だけです。これは文字通り0を返すという意味です。この0という値が整数であることに注意してください。“main”はint型の値、すなわち整数の値を返すんでしたね。だから、ここでは0という整数の値を返しているのです。

ちなみに、関数“main”では、0を返せば成功したことを意味します。逆に、0以外を返せば失敗したことを意味します。

ここでひとつ気になることが出てきますね。関数“main”が返した値はどうなってしまうのでしょうか?

結論から言えば、呼び出し元に返されることになります。もう少し詳しく言うと、オペレーティングシステム(この連載で想定している環境ではWindowsですね)を介して、呼び出し元のプログラム(同じく、この連載で想定している環境ではコマンドプロンプト)に返すことになります。

話だけでは実感がわかないでしょうから、実際に試してみましょう。コマンドプロンプトでは、直前に呼び出したプログラムが返した値は%errorlevel%を使って参照することができます。これをechoコマンドを使って出力してみましょう。

この連載はコマンドプロンプトの解説が目的ではありませんので、echoコマンドなどの詳細については割愛します。ここでは、このようにして確認ができることだけ覚えておいてください。

試しに、return 0; の部分を return 1; にしてから同じように試してみてください。コンパイルしなおすのを忘れないでくださいね。今度は 1 が出力されたのを確認できたかと思います。

最後にもう少しだけ解説を続けます。

今回、return 0; のように書いた部分を「文」(より厳密には「return文」)といいます。C言語では、「関数」の中にいくつかの「文」を書くことでその動きを定義します。「文」の最後は必ずセミコロン( ; )で終わる決まりです。セミコロンを忘れるとコンパイルできなくなりますので、必ず付けてください。

せっかくなので、セミコロンを消してコンパイルしてみてください。次のようなエラーメッセージが出たのではないでしょうか?

エラーメッセージは英語で表示されますが、中学生レベルの英語力で理解できると思いますので、しっかり読んでみてくださいね。一応、単語だけ説明しておくと、「function」というのは「関数」のことです。「token」というのは「字句」のことです。つまり、このエラーメッセージは、字句’}’の前にセミコロンを期待している(expected)のに無いじゃないか! と指摘してくれているのです。エラーが発生した場所も、「ex.cの4行目の1桁目だよ」と指摘してくれています。

慣れるまではちょっと戸惑うかもしれませんが、エラーメッセージをちゃんと読む習慣をつければ、プログラミングの上達は確実に早くなります。

話を「文」に戻します。実は、この何も行わないプログラムには、もうひとつ「文」が含まれています。中括弧で囲んだ部分がそうです。この中括弧で囲んだ「文」のことを「複合文」といいます。「複合文」の最後にはセミコロンをつけません。

上の図のように、「複合文」の中に「return文」が含まれていることになります。「複合文」の中には、「複合文」も含めてどんな「文」でも入れることができます。こうして、いくつかの階層になった「文」を書いていくことで、C言語では複雑な動きを定義できるのです。

何も行わないプログラムなのに結構な解説を書きました。とりあえず動くものを手っ取り早く作るのにC言語は不向きです。もし、そういたことが目的であれば、もっと簡単に動くものが作れるプログラミング言語を選ぶべきです。この連載では、かなり細かいことまで徹底的に解説していきます。すべてを丸暗記する必要はありませんので、必要に応じて、前のページに戻って読み直していただければと考えています。

さあ、何もしないプログラムはこれぐらいにして、次回からは少しずつ目に見える動きをするプログラムを書いていくことにしましょう。

← 1.1 とりあえず動かしてみよう
→ 1.3 文字の出力