みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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)値渡しのはずなのに参照渡しと同じ結果になる


よろしくお願いします。

投稿日時 - 2010-01-30 10:03:12

QNo.5634561

困ってます

質問者が選んだベストアンサー

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が出力されるのだと思う。

投稿日時 - 2010-01-30 10:23:20

お礼

理解できました。
ありがとうございました。

投稿日時 - 2010-01-30 13:38:35

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

まず、(1)ですが、関数プロトタイプ宣言がないと、”普通”はエラーになります。
つまり、それはコンパイルエラーなんです。いや、当然でしょということなのですが、Visual Stduioではコンパイル”できてしまう”んです。
リナックスなどでは、必ずエラーが出るでしょう。試していないですが。
つまり、マイクロソフトのコンパイラーはそういうものが必要なかったり、するんです。
だから、Visual Studioを使いたくないという人がいます。
まとめると、コンパイラ依存です。

(2)ですが、もう一度しっかり本を読んだほうがよいと思います。
関数は、void型です。
値を返すわけではありません。
じゃぁどうしてvoid型の関数があるのでしょうか?
それは、入力した変数or配列を、変えたりするだけの関数を作成するためです。
上のソースの場合、aとbの値を”入れ替える”という動作をするだけです。
そして、そのような動作をした後は、main関数内で、aとbの値は当然入れ替わっています。

投稿日時 - 2010-01-30 10:31:53

お礼

ありがとうございました。

投稿日時 - 2010-01-30 13:39:35

ANo.2

すでに「ちゃんとした」std::swap() が標準で定義されているからです。

投稿日時 - 2010-01-30 10:25:11

お礼

理解できました。
ありがとうございました。

投稿日時 - 2010-01-30 13:38:57

あなたにオススメの質問