第11回

戻り値の無い関数

00/06/29 サンプルプログラムのインデントを改善した
99/06/29 誤字脱字を訂正した
98/11/06 IE4.xに対応させた
98/04/29 メールアドレス訂正

今回は関数について学ぶことにしましょう。
本講座で、「関数」といって真っ先に思い付くのは、お馴染みprintf関数でしょう。この関数は、標準ライブラリの関数の1つで、ヘッダファイルstdio.hの中で以下のように宣言されています(興味のある方は、メモ帳やエディタで開いてみましょう)。
int printf(const char *format,...)
printfに限らず、基本的に関数は、
戻り値 関数名(パラメータ)
といった形で宣言されます。
パラメータとは、関数の呼び出しに使われる値(実引数)を受け取る為に用意された、変数またはその並びのことをいいます。また、パラメータのことを仮引数とも言います。実引数と仮引数で使われる変数名は、一致しなくても構いません

そして引数とは対照的に、関数側からそれを呼び出した側へ返す値のことを戻り値といいます。printfの場合、(呼び出しに成功した時は)出力した文字数(int型)が戻り値となります。ただし、関数の戻り値は無視できるので、本講座ではprintfを使っても、その戻り値を受け取っていませんでした。


printfは既に定義済みの関数でしたが、関数そのものを自分自身の手で定義することが可能です。以下のプログラムの内容は、sakebi関数(叫び(^_^;;)の定義とその呼び出しです。うああ、くだらねぇ。(^_^;;;
#include<stdio.h>
void sakebi(int a){
int i;
    if(a==0)
        printf("いい加減にしろ。>いーざ\n");
    else{
        printf("うぎゃ");
        for(i=0;i<a;i++)printf("ぁ"); 
        printf("ッ!!\n");
    }
}
main(){
    printf("これは、お前に踏み潰されたスライムの痛みだッ!!\n");
    sakebi(3);
    printf("これは、ひなたぼっこ中に不意打ちを喰らったゴブリンの怒りだッ!\n");
    sakebi(6);
    printf("ええと、余計なお世話の回復呪文で浄化してしまったスケルトンの分だぁッ!\n");
    sakebi(9);
    printf("そしてこれは、全てを失った俺の怒りだッ!!\n");
    sakebi(0);
    printf("ぐふッ。\n");
}
実行結果

これは、お前に踏み潰されたスライムの痛みだッ!!
うぎゃぁぁぁッ!!
これは、ひなたぼっこ中に不意打ちを喰らったゴブリンの怒りだッ!
うぎゃぁぁぁぁぁぁッ!!
ええと、余計なお世話の回復呪文で浄化してしまったスケルトンの分だぁッ!
うぎゃぁぁぁぁぁぁぁぁぁッ!!
そしてこれは、全てを失った俺の怒りだッ!!
いい加減にしろ。>いーざ
ぐふッ。
sakebi関数の中の処理についてはこの際どうでもいいとして、(^_^;注目すべき点は、その宣言部分
void sakebi(int a)
の戻り値のところにあるvoidです。戻り値のところがvoidになっているということは、その関数に戻り値が無いということです。つまり、sakebi関数は、何も値を返さないということです。
それと、sakebi関数の中でint型変数iが宣言されていますが、これはsakebi関数の中だけで使える変数となります。mainからはそれを利用することはできません。が、mainで同じ変数iを宣言して、それをmainの中だけで使うことができます(つまり、mainとsakebi関数の中にそれぞれ変数iがある状態)。

関数は、呼び出される前に定義する必要があります。でないと、その仮引数や戻り値はint型として判断されてしまいます。例えば、さっきのプログラムで、sakebi関数よりmainの方が先にくるようにしたら、どうなるでしょう?
mainの中でsakebi関数が呼ばれた際、先にそれが定義されていないので、その引数と戻り値はint型となります。しかし、sakebi関数の実際の戻り値はvoid型なので、型の不一致によるエラーが発生します。
しかし、それを解決する術(すべ)が存在します。それが関数プロトタイプです。それを使うと、さっきのプログラムは以下のようになります。関数宣言の部分のみ(関数宣言後すぐセミコロンがくる)がmainの前に置かれていることや、その定義にあたる部分が、mainの後に配置されていることに注目して下さい。
#include<stdio.h>
void sakebi(int a);
main(){
    printf("これは、お前に踏み潰されたスライムの痛みだッ!!\n");
    sakebi(3);
    printf("これは、ひなたぼっこ中に不意打ちを喰らったゴブリンの怒りだッ!\n");
    sakebi(6);
    printf("ええと、余計なお世話の回復呪文で浄化してしまったスケルトンの分だぁッ!\n");
    sakebi(9);
    printf("そしてこれは、全てを失った俺の怒りだッ!!\n");
    sakebi(0);
    printf("ぐふッ。\n");
}
void sakebi(int a){
int i;
    if(a==0)
        printf("いい加減にしろ。>いーざ\n");
    else{
        printf("うぎゃ");
        for(i=0;i<a;i++)printf("ぁ"); 
        printf("ッ!!\n");
    }
}
それと、大切なことを1つ。 mainも関数です。

つづく。


[メニュー][第10回][第12回]

いーざ
email:CQP00202@nifty.ne.jp