用C语言实现两变量内容交换的N种方法

一:创建变量实现交换

1.#include <stdio.h>
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.改传值调用为传址调用

</pre></p><pre name="code" class="cpp">void swap(int *p1,int *p2)
{
int temp=*p1;
*p1=*p2;
*p2=temp      
}//通过指针改变了变量的内容并未改变变量地址

3.利用指针通过改变变量的地址实现内容交换

#include <stdio.h>
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 <stdio.h>
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;
}//可成功运行,同理可使用减法<span style="color:#ff0000;">{a=a-b;b=a+b;a=b-a;}</span>

加减法存在漏洞:1,当数字很大时会出现溢出;2.它适合交换整型和浮点型数值变量,当用于交换浮点数时可能会出现精度损失。

乘除法存在漏洞:除了加减法中可能出现的问题外还.必需避免a或b等于0的状况。

2.利用位运算实现

不创建临时变量,交换两变量内容

#include <stdio.h>
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

猜你喜欢

转载自blog.csdn.net/erica_ou/article/details/52592281