- 締切済み
戻り値と引数
戻り値と引数の概念がよくわかりません。 質問内容は2つ (1)「戻り値は値を関数元に返す」 とありますが 返すとどうなるのですか? また返さないとどうなるのかを教えて下さい。 (2)引数に関しては眺めていればこの引数が値を渡してるというのは なんとなくわかるのですが、実際のプログラムを組んで関数を作成するときに何を引数にすればいいのかさっぱりです。それを教えて下さい。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- asuncion
- ベストアンサー率33% (2127/6289)
板金を加工して、クルマの車体を作る、という工程を考えてみます。 このとき、板金から(何らかの方法で)車体を作る、というのが関数(の機能)に相当します。 当該関数に与える材料(板金)が引数に、関数が機能を果たした結果得るもの(車体)が戻り値に、それぞれ相当します。 さらに、関数の戻り値(車体)は、別の関数の戻り値(車輪、エンジン、ハンドル、…)とともに別の関数(各部品を組み合わせてクルマの完成品を作る)の引数として渡します。 クルマの完成品を作る関数の引数は各部品(車体、車輪、エンジン、ハンドル、…)で、戻り値はクルマの完成品です。
- chie65536(@chie65535)
- ベストアンサー率44% (8742/19841)
(1) 重要なのは「返すとどうなるか、返さないとどうなるのか」ではありません。 「呼んだ側が、返って来た結果をどうするか?」が重要なのです。 つまり ・値を返さない関数を呼んだら、結果が無いので、呼びっぱなしで放置 ・値を返す関数を呼んだけど、結果は要らないのでので、呼びっぱなしで放置 ・値を返す関数を呼んで、結果が要るので、返って来た値を使う の3つのどれかになります。 で、普通は「呼びっぱなしで放置だと、呼んだ関数が処理を成功したのか失敗したのか判らなくて困ったりする」ので、成功か失敗か、返って来た値を見て判断します。 逆に言えば「絶対に成功する関数で、成功か失敗かを返す必要もなく、関数内で全ての処理を行うので、値を返す必要がない関数」は、返り値を返さなくて構いません。 (2) プログラムを組んでいると「似たような事を何度も繰り返すけど、微妙にちょっとだけ違う」と言う場面に遭う事があります。 この「ちょっとだけ違う部分」が「1、2、3…」のように規則性があるならば、ループ文を書けば何とかなります。 しかし「10、5、8、-3、2…」のように不規則だったり「前回の計算結果で値が変わる」だったりすると、ループ文では不可能です。 そこで、共通部分を関数にして「ちょっとだけ違う部分」を引数で受け取り、処理結果を戻り値で返す事にすれば、処理を1つ書いて済ます事が出来ます。 そうすれば、先ほどの不規則な処理は void func(int param) { paramを使用して処理する。計算するとか、何か表示するとか、何か読み込むとか。 } という関数を作ってから func(10); func(5); func(8); func(-3); func(2); と呼んであげれば済みます。 つまり「毎回、可変なもの」を引数にすれば良いのです。 「可変でない固定なもの」は、直接、そのまま書いてしまえば良いので、引数にする必要はありませんから。
- kimic_3
- ベストアンサー率28% (20/69)
端的にいえば、何か処理をするモノ(関数)に、与える値(引数)で、 その結果が(戻り値)になります。 下の例では、5とか3 が引数となり、関数(足し算)に渡します。 関数内では、5+3という演算が行われ、その結果をcに代入し、 それを返して、結果main 内で c に演算結果の8が代入されます。 --- main() { c = 足し算( 5, 3); } int 足し算( int a, int b) { int c; c = a+b; return( c ); } // (1)別に戻り値が無くても構いません。 main() { my_message("おはよ~"); } void my_message( char s) { printf(s) } my_messageに文字列を渡して、実際にmy_messageで何をするかというと その渡された値(引数)を表示しているだけです。 (2) 関数を作る、といった行為は、「同じような処理をまとめる」ことにつきますので、いかに同じような処理を1つにまとめて、可視しやすくするか、なので、たとえば、 main() { color("赤"); printf("おはよー"); color("青"); printf("今日もがんばりましょー"); } を、 main() { my_msg(赤,おはよー); my_msg(青,今日もがんばりましょー); } void my_msg(iro, msg) { color(iro); printf(msg); } と、書いたほうがすっきりします。(個人差がありますが) なので、引数にするものは何でも構いませんが、あまりたくさんの引数を指定するようにすると、汎用性がなくなります。 ※文法はでたらめなので、読み取ってください。
- Splatter
- ベストアンサー率41% (181/440)
(1)について 関数は戻り値(リターンコード)を、呼出元に返すことができます。 戻り値にも型があり、呼び出した側はそれを受け取ります。 例えば計算を行うメソッドであれば計算結果を返します。 データベース更新などでは更新結果などを返します。 計算結果を受け取って、その値を元に次の処理を行ったり、 更新結果が失敗であればエラーメッセージを出したりできますね。 もちろん戻り値を返す必要がなければ何も指定しません。 戻り値ありなら return 値; 戻り値なしなら return; …と記述します。 ただ何か処理をさせたいだけの関数などは戻り値を指定しません。 (2)について 引数とは、その関数が外部から受け取った値を元に 処理を行う必要がある場合に指定するパラメータです。 例えば円の面積を計算する関数があるとします。 関数の処理は、半径に3.14をかけて結果を返すとします。 この半径を引数として指定することで、どんな値を受け取っても それに応じた円の面積を返す関数になるわけですね。 そこでdouble型の変数を引数として受け取ります。 double型は少数点も扱える変数の型です。 この引数値に3.14をかけて、結果をリターンさせれば完成です。 なぜ関数にするか。それは再利用をしやすいからでしょう。 1つのプログラムで何度も円の面積を計算するような場合、 この円の面積を計算する部分を関数として切り出しておけば 何度も同じ計算ロジックを記述する必要がなくなります。 円周率の計算方法を3.14から3.14159に変更したい、という場合も 円の面積計算関数の3.14と記述している部分を3.14159に 変更するだけで良くなります。 引数の半径がマイナス値のときはエラーメッセージを出すように 変更する、という場合も関数だけを修正すれば良いですね。 プログラムを効率よく作成するために、引数を使用して 何度も再利用できる関数を作成していくのが一般的なのです。 関数の引数と戻り値、コード例は以下のサイトが参考になります。 http://www9.plala.or.jp/sgwr-t/c/sec11.html