我是編程新手,我發現了一個有趣但很難找到原因的問題,所以我寫了這篇文章。
我正在嘗試撰寫交換函式:
當我以傳統方式撰寫交換函式時,
void swap(int *x,int *y){int t=*x;*x=*y;*y=t;}
此功能有效,當然,
void swap(int x,int y){int t=x;x=y;x=t;}
不起作用。但是當我把交換寫成宏時,
#define swap(x,y){int t=x;x=y;y=t;}
作品...
為什么宏可以交換值,盡管它們不使用指標?
uj5u.com熱心網友回復:
為什么宏可以交換值,盡管它們不使用指標?
因為宏和函式的作業方式不同。C 中的函式使用“按值呼叫”語意:當您將變數作為引數傳遞給函式時,只有該變數的值被發送給函式——函式不能更改變數本身。我們通過將指標傳遞給要更改的變數而不是變數本身來模擬“參考呼叫”語意。它仍然是按值呼叫,因為函式仍然不能改變傳入的東西,即地址,但它可以改變存盤在該地址的值,這就是我們想要的。
另一方面,宏只是一個簡單的文本替換;根本沒有函式呼叫。當您使用swap(x,y)宏時,前處理器會將宏的定義插入該位置。就好像你寫{int t=x;x=y;y=t;}的而不是swap(x,y). 當該代碼運行時,它可以更改變數的值。
uj5u.com熱心網友回復:
正如您已經猜到的那樣,第一個有效,但第二個無效,因為在第一個中,您將指標傳遞給要交換的變數,然后使用傳入的指標進行交換它們,有效地改變了存盤在指標指向的位置的值。但是在第二個中,您只是傳遞變數的副本,因為 C 中的所有內容都是按值傳遞的。
然而,第三個有效,因為宏是簡單的文本替換。所以考慮這段代碼:
#define swap(x,y){int t=x;x=y;y=t;}
int main(void){
int a=10;
int b=20;
swap(a,b);
}
這將相當于:
int main(void){
int a=10;
int b=20;
{int t=a;a=b;b=t;};
}
所以這里沒有傳球。swap(a,b)簡單地替換為{int t=a;a=b;b=t;}。您可以通過呼叫來驗證它cpp <file-name>。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/473938.html
上一篇:在AS3中應用雙色變換
下一篇:C 如何創建指向函式的常量指標?
