回覆列表
-
1 # aifue24779
-
2 # 使用者2458317293922
#define CHANGE(a,b,t) t=a;a=b;b=t //定義一個宏,帶有引數a,b,t,將a,b值透過t來交換,b=a錯了
main()
{
int c,d,s;
scanf(%d,%d),&c,&d);
CHANGE(c,d,s)
printf("c=%d,d=%d/n",c,d);
}
格式:#define宏名(引數表) 字串例如:#define S(a,b) a*barea=S(3,2);第一步被換為area=a*b; ,第二步被換為area=3*2;類似於函式呼叫:(1)實參如果是表示式容易出問題#define S(r) r*rarea=S(a+b);第一步換為area=r*r;,第二步被換為area=a+b*a+b;正確的宏定義是#define S(r) ((r)*(r))(2)宏名和引數的括號間不能有空格(3)宏替換隻作替換,不做計算,不做表示式求解(4)函式呼叫在編譯後程序執行時進行,並且分配記憶體。宏替換在編譯前進行,不分配記憶體(5)宏的啞實結合不存在型別,也沒有型別轉換。(6)函式只有一個返回值,利用宏則可以設法得到多個值(7)宏展開使源程式變長,函式呼叫不會(8)宏展開不佔執行時間,只佔編譯時間,函式呼叫佔執行時間(分配記憶體、保留現場、值傳遞、返回值)