2 gywuhengy gywuhengy 于 2016.02.10 12:44 提问

为啥不能实现数字交换
x

#include
void swap(int a,int b);
int main()
{
int x=8,y=10;
int t=0;
cout<<"x="<<x<<" y="<<y<<endl;
swap(x,y);
cout<<"x="<<x<<" y="<<y<<endl;
cout<<"t in main is :"<<t<<endl;
return 0;
}
void swap(int a,int b)
{
int t;
t=a;
a=b;
b=t;
cout<<"t in swap is: "<<t<<endl;
}

x=8 y=10 输出main函数中xy原值
t in swap is: 8 调用swap函数并输出swap中的t的值
x=8 y=10 输出调用函数后的xy值
t in main is :0 输出main函数的t的值
Press any key to continue

6个回答

caozhy
caozhy   Ds   Rxr 2016.02.10 13:02

void swap(int& a,int& b)

leilba
leilba   Rxr 2016.02.12 10:56

总结一下,给你两个不需要定义临时变量的开脑洞的做法,哈哈

 #include "iostream"
using namespace std;

//引用交换法
void _refswap(int &a,int &b);
//指针交换法
void _pointswap(int *a,int *b);

int main()
{
    int x=8,y=10;
    cout<<"x="<<x<<" y="<<y<<endl;
    _refswap(x,y);
    cout<<"交换:x="<<x<<" y="<<y<<endl;
    _pointswap(&x,&y);
    cout<<"换回来:x="<<x<<" y="<<y<<endl;
    return 0;
}

void _refswap(int &a,int &b)
{
    a=a^b;
    b=a^b;
    a=a^b;
}

void _pointswap(int *a,int *b)
{
    *a=*a+*b;
    *b=*a-*b;
    *a=*a-*b;
}

leilba
leilba   Rxr 2016.02.12 11:04

说明一下为什么你原先的做法不能交换呢,因为函数传递的是值,而不是变量本身,当你调用swap(x,y)的时候,实际上,复制了一个x的值和一个y的值,将swap函数放回到main里面就相当于:

 int main()
{
int x=8,y=10;
int t=0;
cout<<"x="<<x<<" y="<<y<<endl;

//swap(x,y);
//注意下面这块相当于是swap放回到main里面的代码
int x_temp=x;
int y_temp=y;

int t;
t=x_temp;
x_temp=y_temp;
y_temp=t;
cout<<"t in swap is: "<<t<<endl;
//到这里结束

cout<<"x="<<x<<" y="<<y<<endl;
cout<<"t in main is :"<<t<<endl;
return 0;
}

可以看出为什么不能进行交换了吧?因为你交换的根本就不是原先的x和y哦

wangzhiyu1980
wangzhiyu1980   2016.02.10 13:20

可以看一下C++的传值和传引用。

91program
91program   Ds   Rxr 2016.02.10 14:00

不好意思,写错了,修改如下:

void swap(int *a,int *b)
{
  int t=*a;
  *a=*b;
  *b=t;
  cout<<"t in swap is: "<<t<<endl;
}

& 是取地址;

  • 才是指针的取值。
91program
91program   Ds   Rxr 2016.02.10 13:59

C 语言 形参与实参 的经典问题。
使用参数传递时,如果想改变实参的值就必须使用指针或者引用。
使用指针的交换函数实现如下:

 void swap(int *a,int *b)
{
  int t=&a;
  &a=&b;
  &b=t;
  cout<<"t in swap is: "<<t<<endl;
}
91program
91program 上面的代码写错了,不应该使用 &(取地址),而应该使用*(取指针的值)。
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!