14歳の自分に衝撃の事実を告げてください

以下コードは、呼びだし元へ 値 を返しています
NETにて調べると、この場合、以下のようにfunctionプロシージャを
使うとあります。しかし、実際は、以下コードのようにsubプロシージャでも
値を返しています。実際、値を返す時は
subでもfunctionでもどちらでも良いのでしょうか?

ご存じの方、教えください

function sansyou(ByRef b As Long)


【コード】
Sub 値渡し()

Dim a As Long

a = 1

Call sansyou(a)

MsgBox a

End Sub

Sub sansyou(ByRef b As Long)

b = b * 2

End Sub

A 回答 (2件)

「値を返す」という表現は普通は「関数の返り値で返す」という意味なので、文字通りに解釈するとfunction限定となります。


ただ、呼び出し元の変数を、プロシージャで変更するには、質問にお書きのように By Reでf渡した変数も、プロシージャ側でで変更できるので、この方法であれば、functionでもsubでも全く同じく可能です。
この「呼び出し元の変数が更新されること」を「値を返す」と呼ぶかは人によりけりでしょうね。呼んでもおそらく通じるので問題ないと思います。

引数の変数を更新したり、グローバル変数を更新したりしりする操作は「副作用」と言います。変数更新だけでなく、ファイルに書いたり、メッセージを出したりも副作用です。
「副作用がどういうものであるか」は、プロシージャの中味を読まないと(あるいはプロシージャの使い方説明書きを読まないと)分からないので、副作用を使わなくて済む処理であれば、普通は使いません。もちろん、副作用を使った方が分かり易いのであれば、使って問題ありません。

functionで配列を返り値とすることもできるので、「複数の値を返したい」であってもfunctionの返り値を配列やオブジェクトにすれば返り値が使えます。By Refでの引数更新とどっちが分かり易いかはケースバイケースで考えます。
    • good
    • 0
この回答へのお礼

大変、勉強となりました。ありがとうございます。

お礼日時:2024/10/02 21:31

>>subでもfunctionでもどちらでも良いのでしょうか?



どちらでも値を返すことができますね。
ただ1つの値だけを返す処理のとき、functionにしたほうがsubよりもわかりやすいと思います。
いくつもの値を返す処理の場合、functionよりsubのほうが適していると思います。
まあ、C言語やBasicで作るとき、グローバル変数を使うことも多いので、こういうことは、深く考えないこともありますが、オブジェクト指向の言語では、グローバル変数を使わないようにするので、意識する必要がありますね。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A