前回までシンプルで引数のない関数の自作方法と、プロトタイプ宣言を利用する方法についてお話しました。
今回は、新しくプロジェクト「0230_myfunc_with_params」を作り、引数付の関数を自作する方法についてお話します。関数に引数を付けることで、自分で作ることのできる関数の機能の幅がぐっと広がるかと思います。
引数をもった自作の関数を作り、利用するプログラムを動かして結果を見てみましょう。プロジェクト「0230_myfun\c_with_params」を新しく作成し、ソースコード「MyFuncWithParams.c」を作成してみてください。
#include <stdio.h>
int maxValue(int, int);
int main() {
int akaiKusuri = -5;
int aoiKusuri = 15;
printf("マメ犬族の商人:赤い薬と青の薬、どっちを買う?\n");
printf("ぷらんく:ちょっと試飲させてー。\n");
printf("赤い薬を飲んで ぷらんく は体力が %d 変化した。\n", akaiKusuri);
printf("青い薬を飲んで ぷらんく は体力が %d 変化した。\n", aoiKusuri);
printf("ぷらんく:体力が %d 回復したほう買います。げふぅ。\n"
, maxValue( akaiKusuri, aoiKusuri ));
printf("マメ犬族の商人:2つぶんお金はらえよ。\n");
}
// 引数のうち、大きいものを返す関数
int maxValue(int a, int b) {
if (a > b) {
return a;
}
return b;
}
このコードを実行してみるとこんな結果になったかと思います。
マメ犬族の商人:赤い薬と青の薬、どっちを買う?
ぷらんく:ちょっと試飲させてー。
赤い薬を飲んで ぷらんく は体力が -5 変化した。
青い薬を飲んで ぷらんく は体力が 15 変化した。
ぷらんく:体力が 15 回復したほう買います。げふぅ。
マメ犬族の商人:2つぶんお金はらえよ。
ぷらんくは両方の薬をのんで、回復量が多かったほう(とういかダメージを受けなかったほう)の薬を買うことをきめました。二つの整数のうち、大きい数値を返す関数 maxValue を自作しています。
引数付の関数をプロトタイプ宣言するときも以下のルールの通りです。
戻り値の型 関数名 ( 引数1の型 引数1の変数名, 引数2の型 引数2の変数名, … 略 … );
プロトタイプ宣言では、引数の変数名は省略可能とお話したかと思います。
その場合 「void myFunc(int, char, double);」などのように定義することができます。
今回のソースコードを確認してみましょう。
int maxValue(int, int);
2行目で、int型を返す maxValue 関数をプロトタイプ宣言しています。
第1引数、第2引数には共に int 型を設定する関数と宣言しています。
今回は引数名を省略しています。下のように変数名を入れても大丈夫です。
int maxValue(int hikisuu1, int hikisuu2);
今回の main 関数の中身を見てみましょう。
4行目~14行目が main 関数の中身です。
int main() {
int akaiKusuri = -5;
int aoiKusuri = 15;
printf("マメ犬族の商人:赤い薬と青の薬、どっちを買う?\n");
printf("ぷらんく:ちょっと試飲させてー。\n");
printf("赤い薬を飲んで ぷらんく は体力が %d 変化した。\n", akaiKusuri);
printf("青い薬を飲んで ぷらんく は体力が %d 変化した。\n", aoiKusuri);
printf("ぷらんく:体力が %d 回復したほう買います。げふぅ。\n"
, maxValue( akaiKusuri, aoiKusuri ));
printf("マメ犬族の商人:2つぶんお金はらえよ。\n");
}
このソースコードの中では特にたいしたことはしてないですね。
5、6行目で変数 akaiKusuri と aoiKusuri を宣言&初期化しています。
11、12行目は一つの printf 関数呼び出しが途中で改行されています。
第2引数には「maxValue( akaiKusuri, aoiKurusi )」が設定されていますね。
ここで自作関数 maxValue にジャンプして、結果の整数を返す処理が動きます。
次に、今回作成された maxValue 関数を見てみましょう。
maxValue 関数は 17~22行目で定義されています。
2つの整数を比較して、より大きい整数を返す機能をもった関数です。
// 引数のうち、大きいものを返す関数
int maxValue(int a, int b) {
if (a > b) {
return a;
}
return b;
}
maxValue は整数を2つ受け取ります。
今回 main関数から「maxValue( akaiKusuri, aoiKusuri )」と呼び出しされており、変数の中身を展開して「maxValue ( -5, 15 ) 」です。
呼び出された側の maxValue の頭では、下のように変数に代入されることになります。
その後の処理を見てみましょう。
// 引数のうち、大きいものを返す関数
int maxValue(int a, int b) {
if (a > b) {
return a;
}
return b;
}
18~20行はその後はif 文で条件 a > b が真(正しい)ときだけ、実行されます。
19行目で 「return a;」となっており、return 文に到達した時点で、関数の処理は終了し、呼び出し元に対して戻り値である変数 a の中身を返します。
もし、 a > b が偽(正しくない)だった場合、if 文の中身である 19~20行目はスルーして、21行目にジャンプします。21行目では「return b;」となっており、変数「b」の中身を呼び出し元に返します。
ここで注意ですが、戻り値で返すのは変数 a ではなく、a の中身の整数です。 main関数の中で a という変数は使えません。
また、関数が呼び出されるときに、関数の中で宣言している int a や int b などの変数は毎回初期化されます。
今回は簡単な引数つきの関数を作成しました。C言語の標準機能で今回作ったような maxValue 関数のような機能をもつ関数は用意されていたりします。
ですが、自分で作って理解してみることでかゆいところに手が届くようなプログラムを書くことができるかと思います。ぜひいろいろな自作関数を作ってみて下さい。
また、ポインタという機能を使った関数を使えるようになると、さらに高機能な関数を作り上げることができるようになります。ポインタの説明についてしたあとに、関数でポインタを使った例をあらためてお話したいと思います。
今回はここまで。おつかれさまでした。
更新日 | 更新内容 |
---|---|
更新なし |
匿名 2019年6月23日 5:52 AM
わかりやすくて参考になりました。
あまじ 2016年10月31日 10:00 PM
>> sorimeさま
コメント頂きありがとうございます!
未熟者なりに調べてはいるつもりですが、
誤った情報もあるかと思いますので、ご参考程度にでもお役立ちいただければと思います。
F.T 2019年9月11日 10:05 PM
どのサイトより理解しやすいです。2章29が待ち通しいです。
あまじ 2019年9月15日 12:57 PM
記事かいている、あまじです。読んでいただいて、しかもコメントも頂きありがとうございます。大変お待たせしてしまって申し訳ありません。
理解しやすいと書いてくださって、とてもうれしいです!
近々執筆再開しようと思います。
もうしばしお待ちいただければと思います・・!
コメント、ありがとうございます。
ごめんなさい。エラーでうまく送信できませんでした。ご迷惑をおかけします。しばらくおいてから再度送信を試していただくか、以下から DM などでご連絡頂ければと思います。
Twitter:@NodachiSoft_jpお名前:以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください
お名前: