1.
関数の基本
関数の基本
・*:..☆ プロローグ ☆..:*・
むかしむかし、あるところに、三匹の兄弟子ブタがいました。さて三匹の子ブタは、それぞれ自分の家を作る事になりました。
長男ブタはスパゲッティーで、
次男ブタは関数という材料で、
三男ブタはオブジェクト指向という方式で。
そこへ友達のオオカミが遊びに来ました。実はオオカミも自分の家を建てようと思っていたのです。
最初にオオカミは長男ブタを訪ねました。長男ブタの家はすっかり出来上がっているようでした。
「やあ、オオカミ君、ごきげんよう。いい家だろ。家作りなんて簡単なものさ。でも、ちょっと問題があってね。少し直そうと思っても、こんがらがったスパゲッティーのせいで直せないのさ。増築やリフォームは難しいかな。」
次にオオカミは次男ブタを訪ねました。次男ブタの家も、だいたい出来上がっているようでした。
「オオカミ君、こんにちは。きれいな家でしょ。関数を使った家作りは、それほど難しくないし実績もあるんだ。初めて作る家としては悪くないよ。」
最後にオオカミは三男ブタを訪ねました。三男ブタの家は、まだ出来ていないようでした。三男ブタは熱心に本を読んでいました。
「オオカミさん、久しぶりです。オブジェクト指向は関数だけよりも良いって聞いたんですけど、これがなかなか難しくて。まだ勉強中なんですよ。」
オオカミは考えました。自分の家をどうやって建てようかと。
「オブジェクト指向は難しいかな。まあ、最初だから関数で建てるのが無難だろう。それにしても、おいしそうだったな、子ブタ君たち...じゃなくて、スパゲッティー。」
C言語は、関数によって全体が構成されるプログラム言語です。
関数とは、処理を行う文から成るプログラム・コードの部品と考えて良いでしょう。C言語のプログラムを作るという事は、関数を作るという事に他なりません。
プログラミング言語における、関数(ファンクション)、サブルーチン、メソッド等の用語は、どれも同じような概念のものですが、C言語では“関数”を用いるのが一般的です。
1.1. main 関数
main 関数
関数には名前が付けられていて、その名前によって識別されます。規約の範囲内で好きな名前を付けることができるのですが、“main”だけは、特別な名前という事になっています。
それは、“main”という名前の関数が、プログラムのエントリー・ポイントとなるからです。つまり、C言語のプログラムが実行されると、main 関数が実行されるのです。そして、通常は main の処理が終了すると、プログラムも終了します。
よって、最も短い C言語のプログラムは、main 関数1つだけのプログラムという事になります。
それでは、簡単な main 関数の例を見てみましょう。
main()
{
printf( "Hello World\n" );
}
- 最初の行の“main”は関数の名前であって、この部分が main 関数の定義、つまり、main 関数の処理を記述している事を示しています。
-
“main”に続く小カッコ( )は、関数にデータを渡す場合に使用する、引数と呼ばれるもののリストを記述します。この場合は引数がない、つまり、渡されるデータが無いのでカッコの中は空です。
- 次の波カッコ { } の中に、main 関数が実行する処理を記述します。この場合は1文だけ記述してあります。
- 波カッコ { } の中に記述されている文 printf…は、printf という名前を持った関数の呼び出しです。printf 関数は標準ライブラリという予め用意されている関数群に存在しています。
main 以外の関数を定義する場合にも、同様のスタイルで記述します。
詳しい定義の仕方については、後の章で説明します。
1.2. 関数の呼び出し
関数の呼び出し
printf( "Hello World\n" ); の記述は、printf という関数を呼び出す、つまり、printf という関数を実行する役目をします。
“printf”が関数の名前、その後の小カッコ ( ) の中に引数リストを記述します。
引数とは、関数が実行される際に必要となる呼び出し側から渡される値のことです。この場合は "Hello World\n" の1つです。複数の値を渡す場合には、カンマ‘,’で区切って記述します。
ダブルクォート(二重引用符)で囲まれた "Hello World\n" は、文字列または文字列定数と呼ばれます。文字列は、main や printf とは異なり、単なる文字の集まりとして扱われます。
末尾にある“\n”は、改行を表しています。文字コードには、文章中の改行を表すための改行コードというものがあるのですが、形のある文字ではないので普通には書けません。このため、C言語では“\n”と記述すれば、改行コードに置き換えられることになっています。改行コード以外にも、いくつかこのように記述する文字コードがあります。
最後のセミコロンは、文の最後を示すものです。関数の呼び出しだけではなく、他の場合でも文の最後にはセミコロンを記述します。
printf 関数は、標準出力に文字列を送る、つまり、コンソール画面に文字列を表示するという機能を持っています。表示する文字列は引数で渡された文字列、この場合は "Hello World\n"、です。
1.3. コードの書き方
コードの書き方
C言語の書式は自由書式と呼ばれるもので、空白や改行を、いくつでも自由に入れることが出来ます。
例えば、前述の例の main 関数は、次のように記述しても同じです。
記述例1:
main(){ printf( "Hello World\n" ); }
記述例2:
main
( )
{
printf(
"Hello World\n"
);
}
空白や改行、タブ(字下げ)は、コードを見やすくするために入れるものなのです。出来上がった実行プログラムに対しての作用はありません。
ただし、“printf”を“print f”のように記述する事はできません。“print”と“f”に分割して解釈されてしまいます。
また、C言語は、ダブルクォートの内部やコメントを除き、ASCII 文字セットの文字(英数字、記号類のみ)で記述します。よって、関数名や変数名に日本語は使用できません。
コメント
コメント
C言語では、プログラムの実行結果に無関係な文である“コメント”を記述できます。
コメントには、以下の2つの記述方法があります。
-
/* ~ */
“/*”で始まり、“*/”までがコメントになります。
-
// ~ [改行]
“//”で始まり、改行、つまり、行の終わりまでがコメントになります。
例:
main()
{
printf( "Hello World\n" );
}
1.4. 式と文
式と文
次のようなものは式です。具体的な内容については、後から解説します。
-
x = y
… xに、yの値を代入する
-
3 + 5
… 算術演算
-
printf( "Hello" )
… 関数の呼び出し
-
p < q
… pとqの比較
プログラムを実現する小さな要素と考えてください。
式の後にセミコロン ‘;’ を付けることにより文になります。複数の式をカンマ ‘,’ で区切り、1つの文にすることも出来ます。
x = y;
printf( "Hello" );
n = x + 12, m = y + 63;
全ての文がセミコロン ‘;’ を伴うわけではなく、分岐処理や繰り返し処理を実現する if 文 や while 文は文ですが、文末にセミコロン ‘;’ を付けません。
関数では、式を含む文によって処理を記述します。そして、プログラムが実行されるという事は、文が実行されることであり、文が含む式が実行される事です。
文の実行順序
文の実行順序
関数内の文は、記述した順番通りに実行されます。
main()
{
printf( "Hello Tokyo\n" );
printf( "Hello Japan\n" );
printf( "Hello World\n" );
}
この場合の実行結果は、
Hello Tokyo
Hello Japan
Hello World
と、なります。
1.5. 簡単なプログラム・ソース
簡単なプログラム・ソース
以下は、C言語のプログラム・ソース・コードであり、コンパイルし、実行することが出来ます。
#include <stdio.h>
main()
{
printf( "Hello World\n" );
}
main() 以降は、前述のとおり main 関数の定義です。
最初の行の #include …は、printf 関数を正しく使用するために、標準ライブラリの printf に関する情報を読み込むための命令です。
今のところは、このような記述が必要である、と、理解しておいてください。多くのC言語入門書では、“おまじない”と、説明されています。
1.6. 関数の定義
関数の定義
main 以外の関数を作成し、呼び出す例です。
#include <stdio.h>
PrintHello()
{
printf( "Hello World\n" );
}
main()
{
PrintHello();
}
PrintHello 関数は、“Hello World”の文字列を表示する機能を持った関数です。
main 関数から、PrintHello 関数を呼び出しています。
PrintHello 関数の定義は、main 関数の定義の前方に記述していますが、後方に記述してもかまいません。ただし、その場合、処理系によってはwarning(警告)を出力するかもしれません。関数を呼び出す前には、その関数がどのような関数であるかという記述が先にある事が求められるからです。これを避ける方法がありますが、ここでは触れません。