参照渡しは参照で渡すこと!
(pass by reference)
参照を渡すことじゃない!
(pass reference)
手渡しは手で渡すこと!
手を渡すな怖い!
詳しくはこの下の方に並んでいるであろう関連記事で。
いかがでしたか?
この記事は最終更新日から3年以上が経過しています。
参照渡しは参照で渡すこと!
(pass by reference)
参照を渡すことじゃない!
(pass reference)
手渡しは手で渡すこと!
手を渡すな怖い!
詳しくはこの下の方に並んでいるであろう関連記事で。
いかがでしたか?
コメントサービス利用規約に基づき、このコメントは削除されました。
@murata0531(編集済み) 1 サービス利用規約に基づき、このコメントは削除されました。
@Zuishin0
@murata05310 サービス利用規約に基づき、このコメントは削除されました。 サービス利用規約に基づき、このコメントは削除されました。 サービス利用規約に基づき、このコメントは削除されました。
@shiracamus(編集済み)
C++の場合
実行結果
0
@Zuishin(編集済み) 0
@shiracamus(編集済み)
0
@Zuishin(編集済み)
0
@shiracamus
0
@Zuishin
0
@shiracamus(編集済み)
C++
実行結果
0
@Zuishin(編集済み) 0
@shiracamus0
@Zuishin(編集済み) 0
@shiracamus(編集済み) - pass by value は「変数の値 で 渡す」
- pass by reference は「変数への参照 で 渡す」
- pass reference は「変数の値であるオブジェクトへの参照 を 渡す」
0
@Zuishin0
@shiracamus(編集済み)
0
@Zuishin(編集済み) 0
@shiracamus(編集済み) - 値型変数の値渡し
- 値型変数の参照渡し
- 参照型変数の値渡し
- 参照型変数の参照渡し
0
@Zuishin0
@shiracamus(編集済み)
0
@Zuishin0
@Zuishin(編集済み)
0
@murata05310
@shiracamus(編集済み)
0
@Zuishin0
@Zuishin0
@shiracamus(編集済み) 0
@Zuishin(編集済み) 0
@shiracamus(編集済み) 0
@Zuishin(編集済み) 0
@shiracamus0
@shiracamus(編集済み) - 参照渡し=呼出し元の変数(実引数)と呼出し先の変数(仮引数)を同一の変数として共有する(変数渡し、変数共有、変数エイリアス)
- 呼出し先で変数(引数)に再代入すれば、(実装はどうであれ)呼出し元の変数に代入される
0
@Zuishin(編集済み)
0
@shiracamus(編集済み)
0
@shiracamus- 変数渡し=呼出し元の変数(実引数)と呼出し先の変数(仮引数)を同一の変数として共有する(変数共有、変数エイリアス)
- 参照渡し=呼出し元の変数(実引数)を呼出し先の変数(仮引数)から参照することで同一の変数として共有する(変数渡しの実装手段、変数共有、変数エイリアス)
- 呼出し先で変数(引数)に再代入すれば、(実装はどうであれ)呼出し元の変数に代入される
0
@Zuishin0
@shiracamus- 広義: 変数渡し = 参照渡し
- 狭義: 変数渡し ⊃ 参照渡し
0
@shiracamus(編集済み)
0
@Zuishin0
@shiracamus- 「変数渡し」のひとつに「参照渡し」がある: 変数渡し ⊃ 参照渡し
- 「変数渡し」を「参照渡し」でしかできない言語もある: 変数渡し = 参照渡し
- 「変数渡し」を「コピーを渡してコピーを書き戻す」実装もある: 変数渡し ≠ 参照渡し
- 「変数渡し(参照渡し等)」ができない言語もある
0
@Zuishin(編集済み) 0
@shiracamus(編集済み) 0
@Zuishin0
@shiracamus(編集済み) 0
@Zuishin0
@shiracamus0
@Zuishin0
@shiracamus(編集済み) 0
@Zuishin0
@shiracamus(編集済み) 0
@Zuishin(編集済み) 0
@caleb70230
@caleb70230
@Zuishin0
@caleb70230
@Zuishin0
@caleb70230
@Zuishin0
@Zuishin(編集済み)
0
@Zuishin(編集済み) 0
@ikiri_comment_taro0
@Zuishin(編集済み) 0
@murata05310
@Zuishin0
@murata05310
@Zuishin(編集済み)
0
@murata05310
@Zuishin0
@murata05310
@ikiri_comment_taro0
@Zuishin0
@ikiri_comment_taro0
@murata05310
@Zuishin0
@ikiri_comment_taro0
@murata05310
@Zuishin(編集済み) 0
@ikiri_comment_taro(編集済み) 0
@Zuishin(編集済み) 0
@ikiri_comment_taro0
@murata05310
@Zuishin0
草
普通にいじめていいかどうか聞いているところです。
@sgimo
草
手 = 変数 であるならば、
手に持っているもの(変数の値)を渡すこと = 値渡し
手そのもの(変数への参照)を渡すこと = 参照渡し
です。
呼び出し先に手(変数)を渡して、呼び出し先で手の上にもの(値)を乗せて(代入して)返すことができます。
PHPの場合の図解はこちら
情報処理試験問題参考例
参照渡しできる言語: C++, C#, PHP, VisualBasic, FORTRAN, etc.
参照渡しできない言語: C, Java, JavaScript, Python, Ruby, etc.
@shiracamus
この記事は、参照型を使用することを参照渡しと呼ぶ人たちへのアンチテーゼです。
参照渡しは参照を介して変数そのものを渡すものであり、言語上、値を参照する値を参照と称して渡すものではありません。
つまり、値を渡す話はここではしていません。
記事のどこにも書いてないので私にはわかりませんでした。
変数を手に例えたとしたら、変数そのものを渡す=手そのものを渡す ということになり、
手を渡しているのに 怖い! というのは変ではないか? と思った次第です。
そうですね。
参照渡しという言葉をどうしても参照型を使うことの意味で使いたい人がいて、その人に「自分で記事を書け」と言われたから書いただけのいい加減なもので、事情を知らない人には通じないのでゴミ記事タグをつけています。
同時に、Qiita ではゴミ記事というタグをつけたら何を書いてもいいということを主張する人が当時何人もいました。
変数でも値でもなく「参照」を手に例えています。
参照値を使用するのではなく、参照を使って呼び出すので pass by reference だという主張です。
参照を渡すのであれば pass reference となるでしょう。
「参照」とは、参照値のことではなく、「変数への参照」ですよね?
変数への参照を使って呼び出し先でも同じ変数にアクセスできます。変数共有します。
つまり、変数そのものを渡したのと同じことになると思うのですが、そこの認識が違いますか?
変数への参照=変数そのもの であり、参照=手 ということであれば 手そのものを渡すのと同じだと思うのですが、違いますか?
参照は参照で、変数は変数ですね。
コードの中で参照値を扱うことはできません。
なので、手を受けとることもできません。
変数に値を代入する = 手にものを乗せる
という例えは通じますか?
で、渡した手(変数a)にもの(2という値)を乗せて返ってくる、という例えは通じないですかね?
私は「手」をその意味では使っていないので、伝わるかどうかはここではさほど関係ないのではないかと。
例えは必ずしもどの角度から見ても例えられるものと一致するものではないので、多くの場合、例えをその文脈外の視点から深掘りする価値はありません。
ここで言っているのはただ一つ。参照渡しは「参照」なる値を渡しているわけではないので、参照型と混同しないようにということで、その傍証として by について言及しています。
「手渡し」の例を出したのは、「手渡し」という言葉もあるように、「○○渡し」が必ずしも○○を渡すこととは限らない、なのになぜ参照渡しは参照を渡すことと思い込んでしまうのか、くらいの意図です。
そうですか。
何が by で手渡しの例がどれと繋がるのか良く分からないままで残念ですが、これで終わりにします。
by というのは、「~を」ではなく「~で」という意味だから、参照「を」渡すのではなく、参照「で」渡すのだという意味です。
pass salt by hand であれば、塩「を」手「で」渡すという意味になります。
この場合、手を渡してはいけません。
「何への」参照なのかが明記されないので混乱する人が多いように思います。
ということでよろしいですか?
奇妙な日本語に思えますけど。
翻訳が奇妙な日本語になることなどいくらでもあると思いますが、pass by reference の元ネタは C++ の標準規格の目次です。引き渡されるのは引数で、これを値で渡すか参照で渡すかという話になります。
実引数への参照を渡すのですよね?
参照渡しのとき、実引数には変数を指定する必要がありますよね? 直値を指定したらエラーになりますよね?
仮引数は実引数を参照して、実引数の値を参照したり実引数に代入したりしますよね?
言語上の用語なので、実装は無関係です。
値のコピーを渡す参照渡しもありますし、参照を渡す値渡しもあります。
たとえば Python は必ず参照を渡しますが、ドキュメントで値渡しであると明言されています。
参照を渡すのが参照渡しであれば、Python は参照渡しになりますし、実際そのように教えるスクールもありますが、事実は違います。
そのスクールの教え方は間違っていますね。情報処理試験では不正解を選ぶことになると思います。
変数を引数に渡す方法には以下の4種類があると思っています。
C++, C#, PHP は すべてできます。
C, Java は 1 と 3 しかできません。
Python は 3 しかできません。
Pythonの値はすべてオブジェクトで、変数はオブジェクトへの参照を値として保持する参照型変数であり、オブジェクトへの参照を渡すこと(3.) と 参照渡し(2.と4.) はまったく違うことを、スクールでは教えないのでしょうね。
同様に、実装内部では値のコピーを渡し、関数終了時に元の変数に値を書き戻すことで参照渡しを実現しているものもあります。
この場合は呼び出した先の関数に参照値は渡っていませんが、参照渡しになります。
この記事で言っているのは、「参照渡しは参照を渡すことではない」ということですが、それがどういうことなのかを伝わるように書いていません。他のところで書いているのと、目的がそれを伝えることではないからです。
Wikipedia(正しいとは限らない)によると、変数渡しの実装手段の一つとして変数への参照を渡す方法と書かれています。
コピーを渡してコピーを書き戻す実装には別の名前があったりしませんかね?
いいえ。前にも書きましたが、参照渡しは言語上の用語で、その実装は無関係です。
参照渡しの実装の一つとして、実装に付けられた別の名前「も」あります。
@shiracamus
こいつの話は信じないほうがいいぞ
こいつはいろんな記事で的はずれな説教して場をあらそうとするエセエンジニアだからな
実態はただのニートや
ここに認識の違いがあるんですかね。
参照渡し(変数渡し)は言語に依存しない情報処理用語で、言語によって参照渡しをサポートするかしないかが異なる、というのが私の認識です。
参照渡しできる言語: C++, C#, PHP, VisualBasic, FORTRAN, etc.
参照渡しできない言語: C, Java, JavaScript, Python, Ruby, etc.
全部言語じゃないですか。
参照を渡さない参照渡しがあることは示したので、自分で裏をとってみてください。信頼できる情報を簡単にみつけることができると思います。
サポートするかどうかが言語によって違うということを書きました。
情報処理試験では言語を特定せずに出題されています。情報処理用語とその作用を理解しているかが問われています。
出題例: https://kanauka.com/kakomon/ap/h25h/020.html
繰り返しになりますが、参照渡しは言語レベル、つまりコンパイル前のソースコードレベルの話ということを言っています。
実装がどうなっていても、参照渡しは参照渡しです。
変数の実装がメモリだろうがレジスタだろうがディスクだろうが、変数は言語レベルの話なので無関係というのと同じです。
これも繰り返しになりますが、参照を渡さない参照渡しは実在していて、簡単に裏をとることが可能です。
信じる信じないではなく、相手が何を言っているかを理解し、自分で裏を取りましょう。でなきゃそこで遠吠えしてる素人と同レベルですよ。
ソースレベルの話: 言語に依存しないソースレベルでの話ということであれば同意です。情報処理試験でもソースコードが提示されますので。
コンパイル前: PHPのようなコンパイルしない言語でも参照渡しできます。PHP言語仕様では参照渡しではなく変数参照と書いてあるようですけれど。
実装は無関係: 同意。情報処理用語なので。Wikipediaには実装の手段名として書かれていますけど。
コンパイルしなくて良い言語なら、それはコンパイル前です。コンパイル後ではありません。伝わらないので角度を変えてコンパイルという言葉を使いましたが、本質はコンパイルにはありません。
コンパイルするかしないかに関係なくソースレベルでの話、でいいのではありませんか?
という私の認識と同じでしょうか?
「言語」では伝わらなかったので別の言葉を使いました。
ソースコードはプログラミング言語で記述するので、言語レベルとソースコードレベルは同じ意味になります。
この場合の言語はマシン語でもなく日本語でもなくプログラミング言語を指しています。
私もその認識です。参照渡しの場合、参照値をプログラマーが知る必要はなく、渡されるとも限りません。
従って「参照渡しは参照を渡すことではない」という結論になります。
「参照」という言葉が「変数への参照」と「オブジェクトへの参照」の両方で使われるのが混乱の元ですね。
とすると、2. の部分で反論がある感じですかね?
広義と狭義を混ぜる必要はないと思います。
ということでしょうか?
Wikipediaの「引数」では以下のような説明構成になっているので、
変数渡し ⊃ 参照渡し
というのが一般認識に思えます。言語によっては、参照渡し以外に変数渡しがないので参照渡しと変数渡しは同じものとなります。
そしてその Wikipedia の分類は標準化されているわけでもなく、ただの一説にすぎません。
なので、どのような分類を採択するかによって用語は変わってきます。
コピーによる参照渡しをを参照渡しと呼んでいる事実を覆すものではありません。
事実 Wikipedia でも、
のように異論を認めています。
更によく読めばわかりますが、その分類は排他的なものではありません。
渡し方の種類を並べているだけです。
という認識でいいですか?
広義 と 狭義 の違いは何でしょうか?
その前に、何が目的なのか聞かせてもらえますか?
読まない人に向けて同じことを何度も繰り返し書かなきゃいけないのにいい加減飽きてきたんだけど。
自分の認識と何が違うのかを確認したいです。
広義 と 狭義 の違いを意識したことがないので知りたいです。
いまのところ、「参照渡し」という言葉を使った時点で「変数渡し=参照渡し」を暗黙知として会話が進んでいるんだろうということは分かってきました。
@Zushin さんの中では「参照渡し=変数渡し」で「コピーを渡してコピーを戻すのも参照渡し」と書かれていたのが私の認識と違っていたのが気になっていて、「コピーを渡してコピーを戻すのも変数渡し」と読み替えればいいのか、それとも違うのか確認したいです。
何のために確認するんでしょうか?
中途半端な状態で気持ち悪いですから。
例えば、
広義 と 狭義 が分からず、何と何が混ざっているのかわかりません。
@Zuishin さんの暗黙知を教えて欲しいです。
中途半端とは思えません。既に書いていることなので、読んで理解すれば良いと思います。
理解が足りないとおっしゃるようなので、言葉を変えてみましょうか。
C++ では参照渡しが言語の仕様で定義されています。
それはコンパイラがどのようなバイナリを吐き出そうとも、参照渡しです。
ここまでわかりますか?
分かります。
ならば、参照が渡らなくても、Wikipedia に何が書いてあろうと、それは依然として参照渡しであるということも当然わかりますよね?
もし実装を変えたとしたなら、仕様書の表記も変わるのではないですか?
例えば pass a variable by copy and copy back とか。
いいえ、実装はたくさんあるので、いちいちそれに合わせて言語の方を変えたりしません。
たとえばコンパイルオプション一つで変数の実装が変わります。
なるほど、そこに認識の相違があって話がかみ合わないのですね。
私としては、C++に限定した時点で違う世界になってしまいます。
繰り返しになりますが、言語レベルの話を実装込みで理解しているから間違うんだと思いますよ。
C# でも、言語レベルで互換性があるなら、たとえどのように実装されていても参照渡しは参照渡しです。
他の言語もそうだと思います。
たとえ Wikipedia にどう書いてあろうとも。
さっきからタイムラインがこのことで埋まってますよ
https://qiita.com/terms
ほどほどにしたほうがいいと思いますよ。
だそうですよ。
報告...
https://qiita.com/terms
ほどほどにした方がいいと思いますよ。
もうやめましょう
どうぞ。
パクりにパクりと言うのは社会的に不適切だという意味不明な理屈でブロックされた上に通報されました。
「盗人猛々しい」の実例をお探しの方があればどうぞ見てみてください。
荒らしコメントがようやく消えましたが、「草」は問題ないんですね。
基準の一つがわかったことは収穫です。
「草」程度の人を小馬鹿にした表現は安心して使うことができます。
草
早速生け贄が来たので、報告して経過を観察したいと思います。
なおこの被験者は不適切なコメントを削除された本人なので、その意味でも条件のいい被験者と言えるでしょう。
草すぎるw
削除された人二号も協力ご苦労。
削除してないんだよなあw
相変わらず妄想だけはすごいねw
削除されてますが。
嫌な記憶は忘れたのかな?
ああそうか、自分で削除したから削除されてはないと。なるほどなるほど。
必死で草
そのワンと吠えてサッと隠れる戦法、なかなか便利そうですね。あなたの個性としてこれからも一生続けてください。
お前はずっと逃げ続けてるけどな
早くこっちにコメントしろよ敗北者さん笑
https://qiita.com/Zuishin/items/f271b52c41533e695606
削除されたっけ?覚えてねーや
そりゃあなたのコメントが削除されるのは日常だから。
ソースないの?
おーい、逃げてないで早くコメントしろよ負け組さん笑
そりゃ通知が飛んできた時点で「ああ俺何か書いたんだな、今は無いけど」ってわかるでしょ。賢い人なら。
通知来てないからねえ
結局ソースないんかい笑
都合悪くなるとすぐ逃げるな〜
なるほどなるほど、通知は飛んできてないけど私のファンだから 2019 年の記事にコメントしたと。
もしかして自主的に削除してるのと勘違いしてる?
って出るから誰でもわかると思ってたが
ワンと吠えてサッ作戦。
どうぞ続けてください。
二人? の個性として。
画像はいつかね。
会話が成り立ってないな
これについて書いてんだけど
ずっと逃げ続けてるくせに何言ってんだか笑
キャンの方が良かった?