• 締切済み

戻り値と引数

戻り値と引数の概念がよくわかりません。 質問内容は2つ (1)「戻り値は値を関数元に返す」 とありますが 返すとどうなるのですか? また返さないとどうなるのかを教えて下さい。 (2)引数に関しては眺めていればこの引数が値を渡してるというのは なんとなくわかるのですが、実際のプログラムを組んで関数を作成するときに何を引数にすればいいのかさっぱりです。それを教えて下さい。

  • zaqwe
  • お礼率15% (19/123)

みんなの回答

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.4

板金を加工して、クルマの車体を作る、という工程を考えてみます。 このとき、板金から(何らかの方法で)車体を作る、というのが関数(の機能)に相当します。 当該関数に与える材料(板金)が引数に、関数が機能を果たした結果得るもの(車体)が戻り値に、それぞれ相当します。 さらに、関数の戻り値(車体)は、別の関数の戻り値(車輪、エンジン、ハンドル、…)とともに別の関数(各部品を組み合わせてクルマの完成品を作る)の引数として渡します。 クルマの完成品を作る関数の引数は各部品(車体、車輪、エンジン、ハンドル、…)で、戻り値はクルマの完成品です。

  • chie65535
  • ベストアンサー率43% (8518/19364)
回答No.3

(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)
回答No.2

端的にいえば、何か処理をするモノ(関数)に、与える値(引数)で、 その結果が(戻り値)になります。 下の例では、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)
回答No.1

(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

関連するQ&A

  • VBAでの戻り値と引数について

    最近VBAでプログラムを勉強しています。 引数と戻り値について教えてください。 定義としては、 引数:プロシージャに渡される定数、変数、および式。 戻り値:呼び出し元に処理の結果を戻す値。 となっているのですがいまいちピンときません。 SubプロシージャとFunctionプロシージャでその違いがあると思うのですが、具体的にどれが引数でどれが戻り値なのかわかりません。 他のプログラミングも全く経験がない初心者で初歩的な質問ですみませんがご教授お願いします。

  • 引数と戻り値がわかりません

    Javaを勉強中なのですが、引数と戻り値がよく分かりません。 自分で買ったテキストをベースに進めているのですが、ここで詰まってしまいます。 具体的に表現するのが難しいのですが、値がどこに行ってどういう流れになっているのかが 自分で追えず混乱してます。 public static method X (String name){ return name; ↑こういう記述です。 「値をとってくる」、「呼び出し元へ値を返す」という事が分かってないのだと思います。 まだまだ知識が覚束ないのでわかりにくいかもしれませんが、 ご教授願います。

  • 関数の引数と戻り値

    度々すいません。 関数に引数として配列のポインタを渡して、戻り値として配列のポインタを返したいのですが、やり方がよく分かりません。 お願いします。

  • 戻り値と返り値の違い

    タイトルの通りの質問内容です。 僕が調べた限りは「同じ」と言う意見が多数でした。 中には ・参照渡しした引数の関数通過後の結果が戻り値、  関数自体が返すのが返り値 とか ・引数なしの関数で戻るのが戻り値、引数ありの関数で  戻るのが返り値 とかはたまたその逆とか、混沌としています。 気になります。

  • recvfrom関数の戻り値について

    初めて質問させて頂きます。 現在、LinuxのUnixドメインを使用した内部通信プログラムを 作成しているのですが、recvfrom関数の戻り値で-512という値が 返ってきて頭を悩ませています。 いろいろなHP等でrecvfrom関数の戻り値について記述されている内容は 受信サイズか-1となっているのですが・・・-512という値については さっぱりでした。 -1の場合は、errnoが入るようなのですが、-512の場合、errnoが0のままで何もはいっていないように見えます。 どの様な問題が発生しているかの見当もつかない状態です。 すみませんが、宜しくお願い致します。

  • 戻り値 引数 と API プログラミング初心者

    先日 戻り値 引数の関係を学びました。 呼び出しもとが関数を呼び出すときに上げる情報を引数、関数の処理から受け取る情報を戻り値であると学びました。 これを学んだ際に、APIも情報を受けわたす窓口であるという点と異なるもの同士(プロシージャとソフトウェア)で連携するという点で似ているなと感じました。 この考え方や認識に誤りはないでしょうか?よろしくお願いします

  • 引き数がポインタでない関数の戻り値はなぜint型なのか?

    最近、疑問に思っていることがあって質問したいんですが、一般的にc言語 で使われる関数っていうのは、引き数としてポインタをとる関数以外は全て 戻り値はint型なのですがこれはなぜでしょう。私自身の結論としては、も し関数の戻り値がchar型だとしたらchar型で表せる範囲の値は全てasciiコー ドとして使われているので、もしエラーがあって戻り値としてEOF(-1)を返す 際に1byteでは同じビット配列になる255が既に使われていてEOFとして-1を定 義できないために、-1と255が同じビット配列ではない1byte以上のデータ型 つまりint型(たぶん、int型がコンピュータが一番効率良く処理できるデータ型なのでたぶんint型を使ったと思いますが)を使ったのではないかと言う 結論に達したのですがこれは正しいのでしょうか。どなたか御教授お願い致 します。

  • メッセージボックス関数の「戻り値」って?(Access2000)

    Access初心者です。 今、自分で勉強しているのですが、メッセージボックス関数の「戻り値」がよくわかりません。 引数の<msg>,<type>,<title>はそれぞれ理解ができたのですが、 戻り値の内容(1「OK」)というのは、何に対しての値なのでしょうか?? ヘルプも見ましたが、私にはさっぱりです。 どなたか簡単にご説明お願いします。

  • 関数の引数に 値を入れることを 渡す その関数が結

    関数の引数に 値を入れることを 渡す その関数が結果を出すことを 返す とか 返り値戻り値 という この認識であっていますか?

  • Java戻り値について

    Javaの戻り値がいまいちよくわかりません。 引数については理解できているのですが、戻り値の「値が戻る?」という表現がよくわからないのです。 もっと言うと、引数との違いがこれまたよくわかりません。 先輩方、お暇な時にでも教えてください。 宜しくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう