C語言小程式--交換兩個變數的值
看到這個題目首先我們可以想到藉助一個第三變數來實現
例如:a=10,b=20 我們想要交換a與b的值,可以藉助一個第三變數temp,把a的值附給temp,把b的值給a,再把temp的值給b,就完成了交換。
起初我們可能寫出這樣的程式碼:
#include<stdio.h> swap_num(int x, int y) { int tmp = x; x = y; y = tmp; } int main() { int a = 10, b = 20; printf("交換前 a = %d,b = %d \n", a, b); swap_num(a, b); printf("交換後 a = %d,b = %d \n", a, b); system("pause"); return 0; }
這段程式碼看似正確,但是它到底能不能得到我們想要的結果呢?執行一下就知道
咦~沒有交換,這是為什麼呢?我們來看下記憶體視窗,看看到底哪裡出錯了吧!
這裡我們可以看到x和y的值確實交換了,但是我們發現a與x,b與y的地址並不相同,這是因為在c中函式的所有引數均已“傳值呼叫”的方式進行傳遞。也就是說,我們剛剛在swap_num函式中的引數x和y只是我們要交換的資料a和b的一份臨時拷貝,而我們真正想要交換的值並沒有進行交換。
那我們應該如何正確地實現兩個函式的交換呢?為了達到訪問呼叫程式的值,我們必須給函式傳遞希望修改值的地址,這樣函式便可以通過這個地址找出要修改的值,並對其進行修改了。因此我們對上面的程式做了如下改進:
#include<stdio.h>
swap_num(int *x, int *y)
{
int tmp =*x;
*x =* y;
*y = tmp;
}
int main()
{
int a = 10, b = 20;
printf("交換前 a = %d,b = %d \n", a, b);
swap_num(&a, &b);
printf("交換後 a = %d,b = %d \n", a, b);
system("pause");
return 0;
}
這次程式會得到我們想要的結果嗎?驗證一下就知道啦~
再檢視下記憶體視窗,會發現這x和y中分別儲存的是a和b的地址,在函式呼叫完成後a和b的值也發生了變化
這種方法就是我們常說的函式中的“傳址呼叫”。
上面的方法做出來以後,我們又想有沒有辦法不使用中間變數就交換兩個變數的值呢?稍加思考,其實這個也不難,我們可以藉助數學中的加減運算來實現。
例如:a=10,b=20 令 a=a+b; 把a-b賦給b(注意:此處的a是重新賦值後的,即 a+b),再把a-b賦給a(此處的a和b都是重新賦值後的),這樣就實現了兩個數的交換。
程式碼如下:
#include <stdio.h>
int main()
{
int a = 10, b = 20;
a = a + b;
b = a - b;
a = a - b;
printf("a =%d ,b=%d", a, b);
system("pause");
return 0;
}
因為這種方法特別簡單,所以我就在主函式中寫了,如果讀者想要包裝成函式,不要忘記要傳給函式的是a和b的地址哦!
除了上述方法,還可以使用異或運算來實現兩個變數的值交換
具體實現如下:
#include <stdio.h>
int main()
{
int a = 10, b = 20;
printf("交換前a = %d,b = %d \n", a, b);
a = a^b;
b = a^b;
a = a^b;
printf("交換後 a = %d,b = %d \n", a, b);
system("pause");
return 0;
}