一:创建变量实现交换
1.#include
int main()
{
int a = 10;
int b = 20;
int c;
printf("before change:a=%d b=%d\n",a,b);
c = a;
a = b;
b = c;
printf("after change:a=%d b=%d\n",a,b);
return 0;
}//可成功运行
//如使用函数调用,结果则不发生改变
void swap(int x,int y)
{int temp; /*该错误属于运行式错误,
temp=x; 形式参数在内存中创立了新的空间,,
x=y; 运行调用函数后,只改变了x,y的地址空间内容,
y=temp; 而实参a,b的实际内容却并未改变。*/
}
2.改传值调用为传址调用
void swap(int *p1,int *p2) { int temp=*p1; *p1=*p2; *p2=temp }//通过指针改变了变量的内容并未改变变量地址
3.利用指针通过改变变量的地址实现内容交换
#include
int main()
{
int a = 10;
int b = 20;
int *p1,*p2,*p
printf("before change:a=%d b=%d\n",a,b);
p1=&a;
p2=&b;
p=p1;
p1=p2;
p2=p;
printf("after change:a=%d b=%d\n",a,b);
return 0;
}//可成功运行
1.利用变量的加减乘除
#include
int main()
{
int a = 10;
int b = 20;
printf("before change:a=%d b=%d\n",a,b);
a=a+b;
b=a-b;
a=a-b;
printf("after change:a=%d b=%d\n",a,b);
return 0;
}//可成功运行,同理可使用减法{a=a-b;b=a+b;a=b-a;}
加减法存在漏洞:1,当数字很大时会出现溢出;2.它适合交换整型和浮点型数值变量,当用于交换浮点数时可能会出现精度损失。
乘除法存在漏洞:除了加减法中可能出现的问题外还.必需避免a或b等于0的状况。
2.利用位运算实现
不创建临时变量,交换两变量内容
#include
int main()
{
int a = 10;
int b = 20;
printf("before change:a=%d b=%d\n",a,b);
a = a^b;
b = a^b;
a = a^b;
printf("after change:a=%d b=%d\n",a,b);
return 0;
}
^ 异或位运算符;
eg:a=3;b=5;
a=0011
b=0101
a^b=0110 //由此可得,根据ab可得出a^b,根据a^b和a可得出b,根据a^b和b可得出a