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

解决方案

void swap(int& a,int& b)

解决方案二:

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

解决方案三:

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

 #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;
}

解决方案四:

说明一下为什么你原先的做法不能交换呢,因为函数传递的是值,而不是变量本身,当你调用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哦

解决方案五:

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

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

& 是取地址;

  • 才是指针的取值。

解决方案六:

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

 void swap(int *a,int *b)
{
  int t=&a;
  &a=&b;
  &b=t;
  cout<<"t in swap is: "<<t<<endl;
}
时间: 2024-09-11 20:55:36

x-为啥不能实现数字交换的相关文章

安卓应用开发-安卓开发中红米手机拍照发出去后为啥旋转了90度

问题描述 安卓开发中红米手机拍照发出去后为啥旋转了90度 10C 开发过程中,做了一个类似微信朋友圈的东西,拍照上传图片的时候,在红米手机上遇到了这个问题,本来是正着拍摄,发出去后在朋友圈显示的是旋转了90度的,如图所示,键盘旋转了90度 解决方案 跟手机有关,手机拍照默认横屏 解决方案二: 我也是红米,做移动开发时拍照是正常的

c语言-这个C语言多项式就和问题,精确度不是太会。为啥就相差0.000512。请详细说明

问题描述 这个C语言多项式就和问题,精确度不是太会.为啥就相差0.000512.请详细说明 解决方案 改用double 调整计算顺序,不要先乘再除,尽量避免乘除法的精度损失 解决方案二: #include <iostream> using namespace std; double f1(int n) { double r = 1; for (int i = 2; i <= n; i++) r *= (double)i; return r; } double f2(double x, i

c语言-为啥找找守形数总是多一个

问题描述 为啥找找守形数总是多一个 #include#includeint main(){ char buf1[4] buf2[4]; for (int i = 1000; i < 1111; i++) { int a = 0 b = 3; int n = 9*i; int c = i; while (c!= 0) { buf1[a++] = c % 10 ; c = c / 10; } while (n != 0) { buf2[b--] = n % 10 ; n = n / 10 ; } i

求救-大神们帮帮忙,小米手机实现拍照照片上传怎么弄的?为啥别的手机可以,他的不兼容呢?

问题描述 大神们帮帮忙,小米手机实现拍照照片上传怎么弄的?为啥别的手机可以,他的不兼容呢? 小米手机实现拍照照片上传怎么弄的?为啥别的手机可以,他的不兼容呢? 解决方案 因为小米手机的系统深度定制过的,建议root下 解决方案二: 1.小米也是安卓系统,通过QQ就可以将照片传入电脑.也可将电脑的照片传入手机. 2.你也可以通过USB,连接电脑与手机,直接拷贝. 解决方案三: 应该可以吧,我看到有那个功能,不行就问问客服

apache安装ACHE_LOCK_DIR未定义为啥

问题描述 apache安装ACHE_LOCK_DIR未定义为啥 apache出现这个问题是什么原因呢 解决方案 apache解压版比较方便,而且解压版可以用多个版本,安装版只能装一个.需要找我,我发解压版给你

数据库-C#DataSet数据调用为啥只能调用一次

问题描述 C#DataSet数据调用为啥只能调用一次 如图,a和name的数据都是正确的,我运行程序后第一次双击listbox1任何一个item都能调出正确的数据反馈到标签中,但是第二次以后双击反馈的数据还是第一次的,求大神解答,能改一下十分感谢. 解决方案 好像对你的问题理解错误了,你打个断点调试下,看看第二次双击其他的项a的值是否有变化,应该还是你的a的问题 解决方案二: 因为你的变量a没有重新赋值,你可以string a =string.empty.每次用之前对a进行赋值而且你的Conn不

ie 8-浏览器兼容性中attachEvent和addEventListener这样用为啥不行?

问题描述 浏览器兼容性中attachEvent和addEventListener这样用为啥不行? HTML: <div class="cy_right"> <h3 class="tit">项目概况</h3> <ul class="cynav"> <li class="current" onclick="liClickOne(this,'merchantsInfo'

vs2010-VS2010明明有语法错误,为啥还能运行通过呢?

问题描述 VS2010明明有语法错误,为啥还能运行通过呢? 解决方案 生成失败会弹出一个提示,问你是否运行之前的程序.你把bin obj目录删除了,就不能运行了. 解决方案二: 如果这都给你检查出来 就没这么多程序BUG了. 死循环怎么解释. 程序能检查语法错误,但是不能检查逻辑错误. 你这属于逻辑错误的案例. 解决方案三: 如果这都给你检查出来 就没这么多程序BUG了. 死循环怎么解释. 程序能检查语法错误,但是不能检查逻辑错误. 你这属于逻辑错误的案例. 解决方案四: 解决方案五: 解决方案

我将jdk的src源文件放在自己工程下面,为啥每次加载还是jdk1.5里面的.class文件?

问题描述 我将jdk的src源文件放在自己工程下面,为啥每次加载还是jdk1.5里面的.class文件? 我将Class.java直接写在自己工程里面,为啥自己代码引用到的还是jdk1.5里面的.class文件有哥哥姐姐们知道原因的吗,求帮忙解决. 解决方案 在创建项目的时候有可以选择jdk版本的 解决方案二: 你虽然自己写了一个同名的类,但是并没有加载你这个类,jdk自己的类(包名+类名)不会因为你同名就加载你这个..可能我解释的不怎么清楚,类加载机制的知识也还得补..但是大概原理就是这样.