1. 程式人生 > >C語言 交換兩個變數數值多種方法

C語言 交換兩個變數數值多種方法

在我們學習程式設計過程中一定編寫過交換兩個變數數值方法,這裡我也蒐集網路一些方法

平臺: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;                       
}

大家也可以測試下,當是負數時是否能夠交換,目前我只有這麼多方法,如果還有更多方法,希望告訴我,程式設計是互相進步的