7 9 案例 交換兩個變數的值

2021-10-22 00:23:42 字數 1693 閱讀 1095

1. 交換兩個函式外部的元素值,直接看 demo

#include void swap(int *a, int *b)

int main()

2. 上面的 swap 函式是有問題的,原因在於只能交換 int 型別的兩個變數的值,如果是其他變數則不行,所以考慮乙個通用的交換版本,什麼型別傳進來都能交換

#include #include #include // size_t型別,目的是找一塊不侷限於某一型別的大小,詳解 

// void*,可以接收任一型別的指標,使用的時候需要有具體的型別

void swap(void *first, void *second, size_t size)

}int main()

3. 對於這種不知道傳來什麼型別,可以利用巨集,巨集的引數可以是 int double 這種資料型別,所以可以定義一下臨時變數進行使用

#define swap(a, b, type)

swap(c, d, double);

printf("\n交換後的值,c:%f, d:%f", c, d); // 交換後的值,c:3.000000, d:4.000000

4. 更進一步,不傳 int double 這種引數,因為傳入的 a b 本身是包含了型別資訊的,可以利用它們的資訊來建立臨時變數,改進上述巨集。需要 mingw 編譯器,因為它有乙個 typeof 的關鍵字,可以獲取引數的型別(msvc 編譯器會報錯:error c2146: 語法錯誤: 缺少「;」(在識別符號「num」的前面)   error c2065: 「num」: 未宣告的識別符號    error c2065: 「num」: 未宣告的識別符號),這個改進的缺點的是**不具備移植性,因為 typeof 不是 c 語言的特性

typeof(a) num = 0;    // 等同於 int num = 0;

printf("\nnum:%d", num); // num:0

#define swap_s(a, b)

swap_s(c,d);

printf("\n交換後的值,c:%f, d:%f", c, d); // 交換後的值,c:4.000000, d:3.000000

5. 還有乙個問題,巨集是替換還記不記得,巨集裡面定義了乙個 temp 變數,如果在**中也定義了 temp 變數,就會發生重複,所以在定義巨集的時候,是有乙個大括號的。但是大括號也帶來乙個問題,比如和 if 進行連用的時候:

if(a);    // if 可以和; 進行配對,加了分號之後後面就不能新增 else了

#define swap_s(a, b)

if(a)

swap_s(c,d); // if(a) ; 因為巨集裡面有大括號,所以這裡的情況就是 if 和 ; 進行配對,else會報錯,解決方案是改寫巨集

else // 報錯:expected expression

printf("www");

// 改寫巨集,需要 do while幫忙,把 ; 處理一下

#define swap_t(a, b) do while(0)

if(a)

swap_t(c,d); // if(a) do while(0); 這裡就可以連用 else 了

else

printf("www");

交換兩個變數的值

交換兩個變數的值 交換兩個變數的值是我們學習c語言常見的問題,通常我們採取的方式是定義中間變數,通過中間變數交換這兩個變數值。1 直接在主函式裡完成 int a 2,b 3 int t t a a b b t 2 通過定義swap 完成交換,其中可以通過引用 位址傳遞完成變數值交換 引用 inclu...

交換兩個變數的值

有兩個整數a和b,下面將用四種方法把他們的值進行交換 方法1 借助臨時變數tmp include intmain 如果要求不能建立其他變數,還有下面的方法 方法2 巧妙進行數值運算 include intmain 方法3 二進位制異或運算 include intmain 整數10的二進位制數表示為 ...

交換兩個變數的值

交換兩個變數的值 方式一 定義臨時變數的方式 int temp num1 num1 num2 num2 temp 方式二 num1 num1 num2 num2 num1 num2 num1 num1 num2 好處 不用定義臨時變數 弊端 1 相加操作肯超過儲存範圍 2 有侷限性 只適用於數值型別...