用C語言實現兩變數內容交換的N種方法
阿新 • • 發佈:2019-02-20
一:建立變數實現交換
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