関数
◎関数定義
その関数が呼び出された時の処理の手順を記述する
○形式
型名 関数名 ( 仮パラメタの名前のリスト )
仮パラメタの型宣言
{ブロック
}
・関数名の前の型名は関数が返す値の型を示す。
・型名がないと int と仮定される
・関数名の後の ( ) は、仮パラメタがなくても必ず必要である。
・仮パラメタの型宣言の形は、記憶クラスを指定しない以外は
局所変数と同じである。
(関数呼び出しの時に記憶場所が確保されていて戻ると開放される)
例1. main 関数の定義
main( )
{
int i;
i=3;
printf("%d\n", i*i);
}
例2. 2乗 を計算する関数
double square( x )
{
return x*x ;
}
◎関数の型宣言
処理の内容の本体が別途定義されている時、戻り値の型だけを宣言する。
○形式
型名 関数名( ) ; ( ) は必ず必要である。
・変数宣言の様に同じ型のものは、,で区切って並べて宣言してよい。
・同じ型の変数宣言と組み合わせてよい。
例
double sin( ) , cos( ); /* math.h には、このような宣言がたくさん入っている*/
double x, sqrt( ); /*変数と一緒に宣言した例 */
◎関数の呼び出し
○形式
関数名(実パラメタのリスト)
・関数名の後の ( ) は、実パラメタがなくても必ず必要である。
・「実パラメタのリスト」は、各々の実パラメタを , カンマ comma
で区切ったものである。
・個々の実パラメタは式である。
例1 sin( theta ), atan2( y, x )
・値を返す関数は、式の要素の一部として使われることが多い
例2
x = r*cos( theta ) ;
・値を返さない関数(他の言語のサブルーチンに当たる)は、
単独で文として使われることが多い
例3
sayhello( ){
printf("Hello\n");
}
main( ){
sayhello( );
}
・値を返す関数が単独で使われた場合、返してきた値は単に無視する。
(当然他にも何らかの作用がある)
例4
printf("x=%f\n",x);
/* 結果として出力した文字数を返すがほとんどの場合無視する。*/
○関数の呼び出しの仕組
1.実パラメタがある場合は、各実パラメタの型に合わせて臨時の記憶場所が
確保され、各々の値が計算されてその記憶場所に格納される。
2.はじめに、局所変数の場所が確保され、関数のブロックが実行される。
・ブロックの中で、仮パラメタを扱う部分は、臨時記憶の中の対応箇所が
対象となる
・戻る方法1
return 式 ;
が実行されると、式の値を関数値として、呼び出した部分に戻る。
・戻る方法2
式のない
return ;
が実行されるた場合は、呼び出した部分に戻るが、値は「不定」である。
・戻る方法3
return が実行されずにブロックの実行が終了した場合は、戻る方法2と同じ
3. 実パラメタのための、臨時の記憶場所が開放される。
このように、実パラメタは、臨時の記憶場所にコピーされて関数に渡されるので、
関数中で、変更しても、呼び出した方の実パラメタそのものの値は変化しない。
◎ C の関数の宣言の補足
1. C の関数の宣言の方法には、仮パラメタの宣言で示した以外に、処理内容を
示さずに、返す値だけを宣言する方法がある。
例 double kansuu();
もちろんこれは、「他のところ」で処理内容を示したものが
なくてはならない。
( #include で示したファイルには、あらかじめ用意された
関数の型宣言が含まれている。)
2. C では、新たな規格にもとづいた、関数の仮パラメタ宣言方法がある。
これは、通常のコンパイラ cc の代わり別のコンパイラ gcc を使う
ことで、利用できる。
従来方式 traditional
double kansuu( x, y )
double x, y;
{ ....
比較的新しい方式 ( ANSI 方式 )
double kansuu( double x, double y )
{
...
こうすると、呼び出すときにパラメタを与える方法がわかる。
ANSI 方式の関数型だけの宣言は
double kansuu( double x, double y );
である。この x と y はなくてもよい。