返却値の指定には return 文を使う.
return 文に出会うと, 関数内の処理はそこで止まり, 呼び出し元に処理は戻される. return 文は複数 存在しても構わない.
return 文を使う際には, 返却値型が void のときには return に 式 を指定しないこと, 逆に返却値型 が void 以外の場合は return に式を指定する必要があることに注意する.
main 関数の仮と返却値:
int main(void){ /* ... */}
int main(int argc, char *argv[]){ /* ... */}
関数は, 呼び出せば, 動くように思いがちだが, どのような関数なのかを宣言せずに呼び出すのは, やや乱暴かもしれない. そこで, 呼び出す前に関数の原型を示す宣言が用意されている.
関数原型宣言 (関数プロトタイプ宣言, Function Prototype Declaration):
返却値型 識別子(仮引数の型, ...);
返却値型 識別子(仮引数の型 仮引数名, ...);
例えば,:
double f(char x, int y){/* ... */};
doublef(char int);
プロトタイプとは, 返却値型と仮引数の型がなんのかを示したものなので, 仮引数の識別子はあってもなくても同じである.
func_call.c
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <stdio.h>
int max(int, int);
int main(void){
int a = 5, b = 9;
printf( "%d\n", max(a, b) );
return 0;
}
int max(int x, int y){
return (x > y ? x : y);
}
|
func_call.c の実行結果は:
[cactus:~/code_c/c_tuts]% ./func_call
9
引数を一切とらないのであれば,:
double f(void);
のように, 仮引数の型に void を指定したプロトタイプ宣言を行う.
これに対し, 仮引数の型を全くしない宣言:
double f();
は [引数をとらない] という意味にはならない. これは, 引数の型が不明という意味になる. このような場合に関数呼び出しをすると, 不明な箇所に代入された変数のすべてに整数拡張が施され, 浮動小数点型の引数は double 型に変換される.
この暗黙の型変換を規定の実引数拡張 (Default Argument Promotions) という.