#include"iostream.h"
void swap(int x,int y);
int main()
{
int a=2,b=3;
swap(a,b);
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
return 0;
}
void swap(int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;
}
得到结果是a=2 b=3 没有交换
无法理解,请详细解释
C++;为什么这里用了swap函数而没有发生交换?
答案:5 悬赏:50 手机版
解决时间 2021-02-28 01:55
- 提问者网友:留有余香
- 2021-02-27 16:40
最佳答案
- 五星知识达人网友:洎扰庸人
- 2021-02-27 16:59
其实这个问题主要取决于你的swap函数所修改的x,y是不是main函数中的a,b
运行结果告诉你不是.
那么x,y是什么呢 x,y代表的是函数栈当中的参数.
相信你听说过函数调用的过程有压栈这一说法吧。
其实x,y是储存在栈当中的
函数调用的时候会为传入参数在栈当中生成值相等的副本。
x,y代表的就是这个副本,而不是代表传入参数。所以你修改x,y不能修改a,b。
如果想要修改a,b就必须知道a,b所在的内存地址.所以可以通过传入地址解决问题.
void swap(int *x,int *y){
int a;
a=*x;
*x=*y;*y=a;
}
如果使用c++可以使用引用解决问题,引用大多数编译器也是通过指针实现的.
void swap(int &x,int &y){
int a;
a=x;
x=y;y=a;
}
----------
很多人都说实参和形参是这个问题原因。
其实我说的是本质.形参和实参只是起概念上的作用罢了。并不能准确的理解这个问题.
运行结果告诉你不是.
那么x,y是什么呢 x,y代表的是函数栈当中的参数.
相信你听说过函数调用的过程有压栈这一说法吧。
其实x,y是储存在栈当中的
函数调用的时候会为传入参数在栈当中生成值相等的副本。
x,y代表的就是这个副本,而不是代表传入参数。所以你修改x,y不能修改a,b。
如果想要修改a,b就必须知道a,b所在的内存地址.所以可以通过传入地址解决问题.
void swap(int *x,int *y){
int a;
a=*x;
*x=*y;*y=a;
}
如果使用c++可以使用引用解决问题,引用大多数编译器也是通过指针实现的.
void swap(int &x,int &y){
int a;
a=x;
x=y;y=a;
}
----------
很多人都说实参和形参是这个问题原因。
其实我说的是本质.形参和实参只是起概念上的作用罢了。并不能准确的理解这个问题.
全部回答
- 1楼网友:春色三分
- 2021-02-27 21:15
形参改变不影响实参,所以要取地址。代码如下。
#include"iostream.h"
void swap(int &x,int &y);
int main()
{
int a=2,b=3;
swap(a,b);
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
return 0;
}
void swap(int &x,int &y)
{
int temp;
temp=x;
x=y;
y=temp;
}
也可以直接把输出放在函数中
#include"iostream.h"
void swap(int x,int y);
int main()
{
int a=2,b=3;
swap(a,b);
return 0;
}
void swap(int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;
cout<<"a="<<x<<endl;
cout<<"b="<<y<<endl;
}
- 2楼网友:旧脸谱
- 2021-02-27 19:38
这是因为调用函数时进行的是 值传递
swap(a,b);实际上执行的是把a的值传给x,把b的值传给y,在函数内部把x,y的值交换了。但实际上a,b的值并没有变。
要想改变a,b的值可以这样:
#include"iostream.h"
void swap(int *x,int *y);
int main()
{
int a=2,b=3;
swap(&a,&b);
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
return 0;
}
void swap(int *x,int *y)
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}
- 3楼网友:从此江山别
- 2021-02-27 18:40
调用swap(a,b);可以理解成执行下面这一段代码
{
int x=a;
int y=b;
int temp=x;
x=y;
y=temp;
}
可以看出,调换的只是x和y的值,a与b的值并没有发生变化
- 4楼网友:你可爱的野爹
- 2021-02-27 18:29
各种缺分号看着真不爽……这样能编译通过的话我吃键盘
1.改成void swap (int& x, int& y)可以使函数可以修改main函数中的x,y
2.目测根本不能在cin后面用endl……
3.貌似只有用getchar函数了…… if(getchar()=='y') cout<<'\n';之类的……
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯