今回は、C言語の基本的な文法をご説明します。プログラミング言語には、私たちが話す日本語のような曖昧さがなく、明確に文法が定められています。そのため、コード内に記述するすべての文字や記号には意味があり、文法に定められていない書き方をしている場合はコンパイルできません。C言語の文法は、国際標準化機構ISOによって定められています。

C言語の標準規格は、古くはC言語の開発者であるBrian Wilson KernighanとDennis MacAlistair Ritchieによる共著「The C Programming Language」(プログラミング言語C)から始まります。標準団体による標準化がおこなわれる前は、通称K&Rと呼ばれるこの書籍が事実上の規格書として扱われ、今でもC言語ファンの間では聖書として親しまれています。後にISO/IEC 9899 : 1990が策定され、現在の多くのコンパイラに採用されています。さらに、ISO/IEC 9899 : 1999が最新の標準規格として制定されています。

Microsoftのドキュメントによると、Visual C++ 2008のコンパイラはISO/IEC 9899 : 1990に準拠すると書かれています。本シリーズでは、開発環境に Visual C++ 2008 Express Editionを用いるため、本シリーズでご説明するC言語はISO/IEC 9899 : 1990に従います。またVisual C++ 2008付属のドキュメント内にある「C Language Reference」も参考になるでしょう。

Visual C++ 2008 Express Editionのインストールや設定方法については「ゼロからはじめるC言語 - 環境構築編」を参照してください。

プログラムの開始から終了まで

C言語のプログラムは、複数の命令をまとめた関数と呼ばれる単位で記述します。関数とは、複数のコードをまとめて、名前を付けたようなものだと考えてください。命令を関数にまとめることで、同じ手順の命令を繰り返し書く必要がなくなり、関数名を指示するだけで、関数内に書かれているコードを実行することができるのです。つまり、何らかの命令の手順を部品化し、繰り返し再利用できるようにしたものだと考えてください。

よって、C言語のプログラムは関数単位で実行されます。計算や比較などの命令は、すべて関数の中に書かれなければならないのです。関数は、関数を識別するために用いられる名前と、外から何らかの値を受け取るためのパラメータ、関数を実行した結果を返す戻り値を持ちます。関数は名前で識別でき、関数を呼び出すには関数の名前が使われます。

関数を呼び出すときに、何らかの参考地として値を渡すことができます。これをパラメータと呼び、関数の内部では外から受け取ったパラメータを計算などに利用できます。そして、計算した結果などを呼び出し元に返す戻り値を持ちます。

関数を作る時には、これら3つの要素、関数名、パラメータ、戻り値を宣言しなければなりません。関数の詳細は文法の基礎を終えた後に、あらためてご説明します。この場では、関数とは次のように記述するものだと覚えてください。

戻り値 関数名(パラメータ)
{
    命令...
}

これが、関数の基本的な構文です。C言語では、計算などの命令はすべて、関数の { } の中に記述します。関数は、任意の数のパラメータを受け、任意の結果を返すことができます。不要であれば、パラメータを受け取らず、結果を返さない関数も作ることができます。

関数は、他の関数内にあるコードから呼び出されます。では、最初の関数はどのようにして実行されるのでしょうか。

C言語では、mainという名前の関数からプログラムが開始されると定められています。よって、プログラムを開始するにはmain()関数を作成する必要があります。main()関数の戻り値やパラメータは、仕様によって定められています。main()関数の書き方は、いくつか存在しますが、次のように記述してください。

int main( void )
{
    命令...
    return 0;
}

関数名の直前にあるintとは、関数が結果として返す戻り値のデータの種類を表すキーワードです。このintとは、関数が1や10といった整数を返すことを表します。続くmainが関数名にあたります。この名前を変えてしまうとmain()関数とは認識されなくなってしまいます。コンパイルするには、必ずmain()という名前の関数が必要なので注意してください。またC言語は大文字と小文字を区別するためMain()やMAIN()などでは認識してくれません。

関数名の後の ( ) は、関数が受け取るパラメータを表します。このmain()関数は、パラメータを受け取らないことを表すキーワードvoidを指定します。よって、main()関数は値を受け取りません。

{ } 内には、任意の命令を書くことができます。計算、分岐や反復、他の関数の呼び出しなど、プログラムの具体的な動作を、関数の本体となる { } 内に記述します。具体的なコードの書き方については後述します。

最後のreturn 0;という行は、関数の結果となる戻り値を指定しています。main()関数は戻り値にintすなわち整数を返すことを宣言しています。よって、関数はコードの終端にreturnという命令を使って整数を返さなければなりません。returnに続く0という値が、結果として返している値です。その後のセミコロン ; は、この命令の終わりを意味するものだと考えてください。

main()関数が返した値は、このプログラムを実行したシステムに返されます。プログラムが返した結果をどのように使うかは、システムに依存する問題です。開発環境や実行システムで、main()関数の戻り値について特別な指示があれば、それに従ってください。そうでなければ、一般的には0が正常終了したことを表し、それ以外の値は何らかのエラーが発生したことを表します。

つまり、C言語ではmain()関数からプログラムが開始され、main()関数のreturnが実行された時点で終了となります。