1. 程式人生 > >用C語言實現兩變數內容交換的N種方法

用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