質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

7回答

20181閲覧

戻り値あり、戻り値なしの使い分けについて

kon_ta

総合スコア81

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

5グッド

5クリップ

投稿2016/07/19 00:31

基本的な質問かもしれませんが、メソッドで戻り値ありの場合と戻り値なしの場合の使い分けは
どのようにすれば良いのでしょうか?
現状メソッドで処理した値を他の部分で用いたい場合には戻り値ありの形で記述するという認識でしたが、
戻り値なしの形で記述しても、そのメソッド内部で他のメソッドを参照して引数を与えてあげれば、他の部分でも
用いることができるのではないかと思いました。

どなたかこのような場面で、戻り値ありの形でメソッドを記述するという具体例を示していただけると幸いです。
よろしくお願いい致します。

yuba, stereo_code, iwamoto_takaaki, musix55, maisumakun👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答7

0

例えば絶対値を求めるabs関数が int abs(int x) という形でなく void abs(int x, 【絶対値を処理する関数】) という形にしてしまえば、というお話になるでしょうか。

はい、このような形でプログラムを構成することは可能です。
むしろこのような形でプログラミングせざるを得ない世界があって、非同期プログラミングはまさにこれの連鎖でプログラムを組み上げていくことになります。
ただし実際やってみるとわかるのですが、そうやって書き上げられたプログラムは複雑怪奇、なかなか人間の目に読めたものではない代物になります。
やはり引数を与えたら戻り値が返ってくる、というプログラミングモデルは人間にわかりやすいのです。
ですからむしろ、非同期プログラミングの世界をどういう風に戻り値が返ってくるプログラミングに落とし込むか、という方向に人々は努力しています。
少し前はFutureパターン(またはPromiseパターン)という方法を使うのが標準的で、もう少し新しくはasync/await構文というのがよりわかりやすいと歓迎されています。
この辺のキーワード、興味があったら調べてみてください。

投稿2016/07/19 01:09

yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

メソッドで戻り値ありの場合と戻り値なしの場合の使い分けは(中略)
現状メソッドで処理した値を他の部分で用いたい場合には戻り値ありの形で記述するという認識

はい、それで合ってます。

戻り値なしの形で記述しても、そのメソッド内部で他のメソッドを参照して引数を与えてあげれば、
他の部分でも用いることができるのではないか

可能かどうかなら可能です。
しかし、とくに意図がないのなら、
なるべく多用すべきではありません。

なぜなら、密結合になるからです。
疎結合を目指すのが筋の良いプログラムです。

参照とは依存でもあり、呼ぶ側と呼ばれる側のメソッドが癒着し、
変更容易性、保守性、汎用性、再利用性などに支障をきたします。

家電でもケーブルはコンセントやスロットに差し込んで使い、
直接ハンダ付けはしない方が使いやすい、といった感じでしょうか。

参照を埋め込むよりは戻り値で済むなら戻り値で返します。
そういう依存の少ないメソッドを組み合わせてシステムを作ると
複雑なシステムでも後で変更しやすくなります。

投稿2016/07/19 01:45

LLman

総合スコア5592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

戻り値なしの形で記述しても、そのメソッド内部で他のメソッドを参照して引数を与えてあげれば

これを突き詰めると継続渡しスタイルという考え方に行き着きますが、ひとまず脇に置きます。

A.

int add(int left, int right) { return left + right; } int mul(int left, int right) { return left * right; } void main() { int x = add(1,2); int y = mul(3,x); printf("%d",y); }

B.

void add_(int left, int right) { int x = left + right; mul_(3,x); } void mul_(int left, int right) { int y = left * right; printf("%d",y); } void main() { add_(1,2) }

A,Bともに(1+2)*3の結果を表示します。
Aは戻り値で返してます。
Bは内部で別の関数を呼んでます。

Bのadd_は足した結果を3倍しないといけませんし、
mul_は結果を必ず表示しないといけません。
つまり再利用性が低いです。
例えば同時に2*3+5とか計算できなくなります。

ポインタとか参照型とかが絡むとまた話が変わりますが、
とりあえずこんな感じです。

投稿2016/07/19 01:16

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Cしか経験はないのですが・・・
これまで質問者さんのようなことで悩んだ経験はほとんど記憶がありません。

何かをしたい場合、情報AとBが必要だが、Bを得るためにはデータa,bを用いて
何らかの作業(演算)が必要な場合
B = getB(a,b);
などとやるはずです。これを
foo(A, a, b);
でも確かにできますが、そうすると
「情報A,Bを用いて処理Xをする」
という役割は元々の関数ではなく foo() が担うことになります。
また、
「データ a, b を用いてBを求める」
という事が foo() の中を見ないとわからなくなります。

結局は、関数(メソッド)で役割をどう分担するか、の問題だと思いますが、
引数を渡す → 渡された引数で処理をする → 結果を返す → 結果を受け取り処理を進める
がスッキリすると思います。

投稿2016/07/19 01:38

nob.

総合スコア711

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

戻り値なしはそのオブジェクトに対する操作(情報変更など)だけで完結するもの、出力だけなどの結果を求めないものなどに使うことになるのではないでしょうか。

戻り値なしの形で記述しても、そのメソッド内部で他のメソッドを参照して引数を与えてあげれば、他の部分でも

用いることができるのではないかと思いました。

「他のメソッド」を使うことが最終目的ならそれでもいいのですが、元のメソッド(戻り値ありにしていたもの)の結果を他の形で使うことが不可能になります。
基本的にメソッドは役割ごとに分割するべきで、例えば図形であれば面積を求めるなら、その結果である面積の値を計算して返すという段階で終了するべきです。他の出力などの役割は別のところで行うべきです。

投稿2016/07/19 01:00

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「メソッドで処理した値を他の部分で用いたい場合には戻り値ありの形で記述する」が基本だと思います。

そのメソッド内部で値を別のメソッドに引数として渡すことは可能ですが、どのメソッドに渡すのかが固定(コードの中で指定)なので、柔軟な使い方が出来ません。

投稿2016/07/19 01:31

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C言語の場合は他の言語と違って、例外機構やオブジェクト指向がありませんので、関数外部とのやり取りはすべて引数を通じて行うしかありません。また、配列で返り値を返すなんて芸当も困難ですので、「返り値はエラーコード、他にやり取りするデータはポインタ経由で書き込み」というようなインターフェースになっていることもあります。

オブジェクト指向で、例外も備えたような言語の場合、エラーは例外で投げられるので、呼び出した側で必要な情報が「成功か失敗か」だけなら、値を返さなくても構いません(Javaのsetterなどは、ふつうそんな感じになります)。

ただ、jQueryに見られるように、メソッドチェーンを行うために「返すものがなくてもとりあえずthisを返す」というような書き方も存在しています。あと、Rubyではメソッドの最後の行が自動で返り値になるので、返すつもりがなくても意図しないものが返り値となっていることがよくあります(たいていの場合、その値は捨てられるだけなのでどこにも影響しませんが)。

投稿2016/07/19 01:01

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問