アプリ版:「スタンプのみでお礼する」機能のリリースについて

次のコードは、入門書にあった値渡しのサンプルです。
値渡しなので、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)値渡しのはずなのに参照渡しと同じ結果になる


よろしくお願いします。

A 回答 (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が出力されるのだと思う。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/01/30 13:38

まず、(1)ですが、関数プロトタイプ宣言がないと、”普通”はエラーになります。


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

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

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

お礼日時:2010/01/30 13:39

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2010/01/30 13:38

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