サンプルプログラム hello.c
(5)関数
「関数」とは数学で云うところの「関数」をイメージして頂ければ良いかと思います。 C言語のプログラムはすべて関数からできています。 まぁサンプルプログラムを見て頂いた方が速いと思います。
#include <stdio.h> void main( void ) { printf( "Hello World\n" ); }
C言語ではプログラムは必ずmain関数が最初に実行されます。
上のサンプルプログラムではmain関数は、
void main( void )
として記述が開始されています。
関数は、
【戻り値の型】【関数名】( 【引数】, .... )
と、宣言します。
上のサンプルプログラムでは【戻り値※1の型】はvoidになっています。
voidは「戻り値はありません」という事を示しています。
【引数※2】ですが、こちらもvoidになっています。
つまり「引数はありません」という事を示しています。
main関数の本体は括弧 {} で括られている範囲のところです。
{}で括られているところの中身は1行で
printf( "Hello World\n" );
となっています。printfはコンソールに文字列を出力する標準関数※3で、
ここでは Hello World という文字列を出力しています。
ひとつ注意点ですがprintf文の最後がセミコロン ; で終わっています。
C言語では1つの文の終端記号としてセミコロンを付けることになっています。
逆に終端記号のセミコロンを検出するまでは文が続きます。たとえば、
printf ( "Hello World" ) ;
と変な記述をしてもコンパイラはちゃんと解釈してくれます。
C言語は比較的自由な書き方ができますので自分なりの書き方を確立した方が上達の早道かもしれません。
とりあえず最初のうちは他の人の記述を真似してみましょう。
プログラムの先頭行の#include文ですが、とりあえずこれは標準関数printfを使うための「おまじない」とお考え下さい。
- ※1
- 戻り値とは関数が演算した結果、呼び出し側に返す値です。
戻り値はプログラマが自由に任意の値を返すことができます。
このサンプルプログラムのmain関数は戻り値を返さないということで void にしています。
ちなみに...ですが、Windowsのコンソールアプリの場合にはint型の戻り値を返すのが正しいです。 void にしているのは本当は正しくないです。
- ※2
- 引数とは関数を呼び出す際に渡す数値等です。
引数に変数を指定した場合、呼び出し側の変数と呼び出された側の変数の数値は当然同じになりますが、変数自体は別物(別の入れ物)になりますのでご注意下さい。
- ※3
- 標準関数とはCコンパイラに付属する、よく使用される標準的な関数のことです。
たいていのCコンパイラにはこの標準関数が付属しますので移植性は高くなります。
ただし、組み込み用のCコンパイラには付属しないことが多いですのでオリジナル関数を自作した方が良いでしょう。
サンプルプログラム func.c
値を加算する関数(add関数)
#include <stdio.h> /* 引数 x, y を加算する関数 * * x 加算する値1(引数) * y 加算する値2(引数) * * 戻り値は int型 */ int add( int x, int y ) { int z; z = x + y; return( z ); } void main( void ) { int z; z = add( 1, 2 ); printf( "%d + %d = %d\n", 1, 2, z ); }
2つのint型の引数の値を加算して返すadd関数です。
add関数は、
int add(int x, int y )
となっています。
戻り値はint型で関数名はadd、引数はint型xとint型yの2つとなっています。
次に、
int z;
という行はローカル変数という変数を宣言しています。
C言語では変数を使用する場合には、すべて使用する前に宣言する必要があります。
ローカル変数は宣言された位置以降から次の対応する閉じ括弧 } が現れるまで使用できる変数です。
このローカル変数 z はadd関数の先頭で宣言されているため、add関数の終わりまで使用することができます。
次の、
z = add( 1, 2 );
という行は、関数addを呼び出して引数(ここでは 1 と 2)を加算した結果をローカル変数 z に代入しています。
C言語以外でも一般的な言語ではそうなのですが、=(イコール)は等しいことを表すのではなく、右辺の値を左辺の変数に代入するという意味で使われます。
次の、
printf( "%d + %d = %d\n", 1, 2, z );
という行は、結果をコンソールに出力しています。
最初の引数の中の %d はint型の数値を10進数で出力する意味です。
%d は合計3つありますのでint型引数は合計3つ必要になり、続く 1, 2, z がそれぞれの対応する引数になります。
実行結果は、
1 + 2 = 3と表示されます。
C言語では /* から */ までの間はコメント行として認識されますので自由にメッセージを書き込むことができます。 また最近のCコンパイラは // 以降(行末まで)もコメント行として扱われます。 私は /* */ よりも // の方が使いやすいので // を多用しています。