C語言 交換兩個變數數值多種方法
阿新 • • 發佈:2019-02-19
在我們學習程式設計過程中一定編寫過交換兩個變數數值方法,這裡我也蒐集網路一些方法
平臺:ubuntu10 gcc編譯器
下面再寫下交換兩個變數值的方法: #include <stdio.h> //第一種不講了,太簡單了,大部分都會想到,看著很LoW,所以接著往下看 #define SWAP1(a, b) \ { \ int t = a; \ a = b; \ b = t; \ } //第二種實際編譯不能通過的,因為巨集定義不允許引數帶&,所以這種方法只能寫成函式形式,所以這裡也說明了巨集定義和函式是有區別的,巨集定義是在預編譯階段執行簡單替代,沒有記憶體佔用,而函式是在編譯階段是佔用記憶體的 //#define SWAP2(&a, &b) \ //{ \ // int t = *a; \ // *a = *b; \ // *b = t; \ //} //這種方法實際是通過傳變數地址的方式更改變數值,學指標時一般都會寫這個,實在不懂就百度吧 void SWAP2(int *a,int *b) { int t = *a; *a = *b; *b = t; } //第二種方法看著稍微逼格一點了,再往下面看吧 #define SWAP3(a, b) \ { \ a = a + b; \ b = a - b; \ a = a - b; \ } //第三種方法也是可以交換的,優點省去中間變數,缺點會溢位 #define SWAP4(a, b) \ { \ a = a * b; \ b = a / b; \ a = a / b; \ } //第四種方法也是可以交換的,優點省去中間變數,缺點會溢位 #define SWAP5(a, b) \ { \ a = a ^ b; \ b = a ^ b; \ a = a ^ b; \ } //第五種方法也是可以交換的,優點省去中間變數,而且不會溢位,所以這種方法很好 #define SWAP6(a, b) \ { \ b = (__int64)((__int64)a << 32 | (a = b)) >> 32; \ } //第六種方法看著更逼格了(再網上看到的),但是實際編譯不通過,因為gcc不支援_int64,但是在VS2010裡面可以編譯通過,但是交換不了,網上說在VC6.0可以,但是因為我沒有VC6.0軟體,所以不知道行不行 //我們首先說下原理吧 //先把a強制轉化為64位整型變數,然後把它左移32位後與(a=b)按位或,把整個結果再強制轉換為64位整型變數,然後右移32位得到b的值。其實,求b的值沒必要有|(a=b)這部分,但因為想同時把b的值賦給a,且把|(a=b)放在這兒不會影響到b最終的值,所以寫成這樣。這兒就採用移位的方法避免了用中間變數 int main(void) { int a = 1; int b = 2; printf("交換前a和b數值\n"); printf("a = %d\n", a); printf("b = %d\n", b); SWAP3(a ,b); printf("交換後a和b數值\n"); printf("a = %d\n", a); printf("b = %d\n", b); return 0; }
大家也可以測試下,當是負數時是否能夠交換,目前我只有這麼多方法,如果還有更多方法,希望告訴我,程式設計是互相進步的