错误示范
#include <stdio.h>
void swap(int x,int y)
{
int temp=x;
x=y;
y=x;
}int main()
{
int a=10,b=20;
printf("交换前:a=%d b=%d\n",a,b);
swap(a,b);
printf("交换后:a=%d b=%d\n",a,b);
return 0;
}
最后输出结果:
交换前:a=10 b=20
交换后:a=10 b=20
为什么?
x,y为形参,函数内对形参的改变不影响实参a,b。
使用指针
#include <stdio.h>
void swap1(int *x,int *y) //此处*代表x,y为指针变量
{
int temp=*x; //此后*为解指针操作,即*x表示x所指的值
*x=*y;
*y=*x;
}int main()
{
int a=10,b=20;
printf("交换前:a=%d b=%d\n",a,b);
swap1(a,b);
printf("交换后:a=%d b=%d\n",a,b);
return 0;
}
最后输出结果:
交换前:a=10 b=20
交换后:a=20 b=10
不想用指针变量
#include <stdio.h>
void swap2(int &x,int &y) //&为引用,引用变量作为目标变量别名使用
{
int temp=x;
x=y;
y=x;
}int main()
{
int a=10,b=20;
printf("交换前:a=%d b=%d\n",a,b);
swap2(a,b);
printf("交换后:a=%d b=%d\n",a,b);
return 0;
}
最后输出结果:
交换前:a=10 b=20
交换后:a=20 b=10
不想写函数
#include <stdio.h>
int main()
{
int a=10,b=20;
printf("交换前:a=%d b=%d\n",a,b);
a=a^b;
b=a^b;
a=a^b;
printf("交换后:a=%d b=%d\n",a,b);
return 0;
}
最后输出结果:
交换前:a=10 b=20
交换后:a=20 b=10
怎么回事?
位运算 ^ 异或,相同为0,相异为1
原码:符号位加上真值的绝对值
反码:正数反码与原码相同;负数反码符号位不变,其余位取反。
补码:正数补码与原码相同;负数补码=反码+1。
例如:
4的二进制:00000100——原码
8的二进制:00001000——原码
4的二进制:00000100——补码
8的二进制:00001000——补码
4^8:00000100
^
00001000
=00001100;
那么整数a,b
a^a=0,b^0=b;
a=a^b;
b=a^b; //b=a^b^b=a^0=a
a=a^b; //a=a^b=a^b^a=b