- ベストアンサー
C++ 関数プロトタイプと値渡し・参照渡しについて
次のコードは、入門書にあった値渡しのサンプルです。 値渡しなので、a=5 ,b=10が出力されます。 void swap(int x,int y); //←抜けていた int main(){ int a=5; int b=10; swap(a,b); cout<<"a="<< a << "\n"; cout<<"b="<<b<<"\n"; } void swap(int x,int y){ int tmp=x; x=y; y=tmp; } しかし、自分で入力したところ何故かa=10,b=5が出力されました。 (VisualC++2008で実行しました。) よく見てみると、上記1行目の関数プロトタイプが抜けていました。 入門書を読んだ限りでは、次の2点が理解できません。 (1)main関数の後ろにswap関数があり、関数プロトタイプが無いのでコンパイルエラーになるはずなのにならない (2)値渡しのはずなのに参照渡しと同じ結果になる よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
C++をマトモに学んだことはありませんが、 たぶん原因は「ユーザ(hoge_1975さん)」が定義したswap関数ではなく C++の標準のstd::swap(T& a, T& b)をmain関数が読んでいるんだと思う。(そもそもmainはプロトタイプ宣言がないから後ろにユーザー定義のswapが出てくるか知らないのだ) http://www.cplusplus.com/reference/algorithm/swap/ #include <iostream>だけで#include <algorithm>とかせずに使えているけどいいのかわからんけど。 =========== で、多分そういう理由だからこそ #include <iostream> using namespace std; //void swap(int x,int y); int main(){ int a=5; int b=10; swap(a,b); cout<<"a="<< a << "\n"; cout<<"b="<<b<<"\n"; } /* void swap(int x,int y){ int tmp=x; x=y; y=tmp; } */ とユーザー定義の関数をまるっとコメントアウトしちゃっても a=10,b=5が出力されるのだと思う。
その他の回答 (2)
- kopanda116
- ベストアンサー率37% (88/232)
まず、(1)ですが、関数プロトタイプ宣言がないと、”普通”はエラーになります。 つまり、それはコンパイルエラーなんです。いや、当然でしょということなのですが、Visual Stduioではコンパイル”できてしまう”んです。 リナックスなどでは、必ずエラーが出るでしょう。試していないですが。 つまり、マイクロソフトのコンパイラーはそういうものが必要なかったり、するんです。 だから、Visual Studioを使いたくないという人がいます。 まとめると、コンパイラ依存です。 (2)ですが、もう一度しっかり本を読んだほうがよいと思います。 関数は、void型です。 値を返すわけではありません。 じゃぁどうしてvoid型の関数があるのでしょうか? それは、入力した変数or配列を、変えたりするだけの関数を作成するためです。 上のソースの場合、aとbの値を”入れ替える”という動作をするだけです。 そして、そのような動作をした後は、main関数内で、aとbの値は当然入れ替わっています。
お礼
ありがとうございました。
- koko_u_u
- ベストアンサー率18% (216/1139)
すでに「ちゃんとした」std::swap() が標準で定義されているからです。
お礼
理解できました。 ありがとうございました。
お礼
理解できました。 ありがとうございました。