a与b交换,为啥结果不理想,该怎么处理
a与b交换,为啥结果不理想
运行结果是
| 4 | 5 |
| 4 | 5 |
为啥不是45 54 呢?
------解决方案--------------------
这里的a,b的确交换了,但是和main传入的a,b是无关的,这里是一个值传递的问题。值传递仅仅是将变量的值传递给参数,也就是会将实参的值copy给形参,但这两个量是无关的,所以对形参的修改是无效的。
你这里需要的是地址传递,把变量的地址传递给形参,因为任何变量的地址都是唯一的,所以找到变量的地址,就可以对这个变量做操作了。C语言的话只有指针传递,C++有指针和引用,试试看下面两个版本:
------解决方案--------------------
楼上正解。建议你多看看书、初学阶段没必要一遇到问题就依赖他人、多看几遍书就慢慢懂了。
------解决方案--------------------
偶是来把水搅浑的。
#include <stdio.h>
int main()
{
int a = 4;
int b = 5;
printf("| %d | %d |\n",a,b);
swap(a,b);
printf("| %d | %d |",a,b);
system("pause");
}
int swap(int a,int b)
{
int tmp = a;
a=b;
b=tmp;
}
运行结果是
| 4 | 5 |
| 4 | 5 |
为啥不是45 54 呢?
------解决方案--------------------
#include <stdio.h>
int main()
{
int a = 4;
int b = 5;
printf("
------解决方案--------------------
%d
------解决方案--------------------
%d
------解决方案--------------------
\n",a,b);
swap(a,b);
printf("
------解决方案--------------------
%d
------解决方案--------------------
%d
------解决方案--------------------
",a,b);
system("pause");
return 0;//注意return啊,良好习惯,虽然除了main可以不返回,但其他有返回值的函数是不能不返回的,比如下面的swap
}
void swap(int a,int b)//没有返回值就不要写int,你写了int缺没有return,编译器能通过?
{
int tmp = a;
a=b;
b=tmp;
}
这里的a,b的确交换了,但是和main传入的a,b是无关的,这里是一个值传递的问题。值传递仅仅是将变量的值传递给参数,也就是会将实参的值copy给形参,但这两个量是无关的,所以对形参的修改是无效的。
你这里需要的是地址传递,把变量的地址传递给形参,因为任何变量的地址都是唯一的,所以找到变量的地址,就可以对这个变量做操作了。C语言的话只有指针传递,C++有指针和引用,试试看下面两个版本:
int main(){
……
swap(&a,&b);//用&取地址
……
}
void swap(int *a,int *b)//指针版
{
int tmp = *a;
*a=*b;
*b=tmp;
}
int main(){
……
swap(a,b);
……
}
void swap(int &a,int &b)//引用版
{
int tmp = a;
a=b;
b=tmp;
}
------解决方案--------------------
楼上正解。建议你多看看书、初学阶段没必要一遇到问题就依赖他人、多看几遍书就慢慢懂了。
------解决方案--------------------
偶是来把水搅浑的。
#include <stdio.h>
#define SWAP(a,b) do ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):((a)=(a)); while (0)
char *p1="1" ,*p2="2" ;
char c1=1 , c2=2 ;
short s1=1 , s2=2 ;
int i1=1 , i2=2 ;
__int64 I1=1i64, I2=2i64;
float f1=1.0f, f2=2.0f;
double d1=1.0 , d2=2.0 ;
void main() {
SWAP((int)p1,(int)p2); printf("char * %5s, %5s\n",p1,p2);
SWAP(c1,c2); printf("char %5d, %5d\n",c1,c2);
SWAP(s1,s2); printf("short %5d, %5d\n",s1,s2);
SWAP(i1,i2); printf("int %5d, %5d\n",i1,i2);
SWAP(I1,I2); printf("__int64 %5I64d,%5I64d\n",I1,I2);
SWAP(*(int *)&f1,*(int *)&f2);printf("float %5g, %5g\n",f1,f2);
SWAP(*(__int64 *)&d1,*(__int64 *)&d2);printf("double %5lg, %5lg\n",d1,d2);
SWAP(c1,c1);
printf("%d\n",c1);
}
//char * 2, 1
//char 2, 1
//short 2, 1