次のコードは、入門書にあった値渡しのサンプルです。
値渡しなので、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)値渡しのはずなのに参照渡しと同じ結果になる
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
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が出力されるのだと思う。
No.3
- 回答日時:
まず、(1)ですが、関数プロトタイプ宣言がないと、”普通”はエラーになります。
つまり、それはコンパイルエラーなんです。いや、当然でしょということなのですが、Visual Stduioではコンパイル”できてしまう”んです。
リナックスなどでは、必ずエラーが出るでしょう。試していないですが。
つまり、マイクロソフトのコンパイラーはそういうものが必要なかったり、するんです。
だから、Visual Studioを使いたくないという人がいます。
まとめると、コンパイラ依存です。
(2)ですが、もう一度しっかり本を読んだほうがよいと思います。
関数は、void型です。
値を返すわけではありません。
じゃぁどうしてvoid型の関数があるのでしょうか?
それは、入力した変数or配列を、変えたりするだけの関数を作成するためです。
上のソースの場合、aとbの値を”入れ替える”という動作をするだけです。
そして、そのような動作をした後は、main関数内で、aとbの値は当然入れ替わっています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語 3 2022/10/04 15:07
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
typedef enumの使い方を教えて...
-
C++のfor文について
-
構造体の要素すべてに対する四...
-
識別子が定義されていませんと...
-
関数の実体定義にヘッダファイ...
-
GCCで暗黙の型変換の警告を出し...
-
構造体を引数とする、クラス間...
-
直接アドレス指定のポインタの...
-
DDVによるメッセージの変更
-
構造体vectorの入れ子のfillの...
-
呼び出し時のパラメータが足りない
-
2重定義って??
-
namespace定義の使い方
-
C言語のreturnの使い方
-
main.c:7:43: warning: implici...
-
【#define】 defineで定義した...
-
void func( void )について
-
DLLのLPSTR 項目の戻り値の取得...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
2重定義って??
-
long型の定数の末尾にLを付ける...
-
C++のfor文について
-
typedef enumの使い方を教えて...
-
関数の実体定義にヘッダファイ...
-
変数の型を定義しなかった場合...
-
ハンドルされていない例外が発...
-
C++でboolにintの値を代入する...
-
main.c:7:43: warning: implici...
-
プログラムの中で別のmainを呼...
-
【#define】 defineで定義した...
-
void func( void )について
-
構造体の要素すべてに対する四...
-
C++の(左辺値)参照を参照渡し
-
構造体の宣言でエラーが出ます。
-
main()とint main(void)の違い
-
intとINTの違いは?
-
エラー「invalid conversion fr...
おすすめ情報