#define SQ(y) (y)*(y) main(){ int a,sq; printf("input a number: "); scanf("%d",&a); sq=SQ(a+1); printf("sq=%d\n",sq); }
上例中第一行爲宏定義,形參爲y。程序第七行宏調用中實參爲a+1,是一個表達式,在宏展開時,用a+1代換y,再用(y)*(y) 代換SQ,得到如下語句:
sq=(a+1)*(a+1);
這與函數的調用是不同的,函數調用時要把實參表達式的值求出來再賦予形參。而宏代換中對實參表達式不作計算直接地照原樣代換。
#define SQ(y) y*y
main(){
int a,sq;
printf("input a number: ");
scanf("%d",&a);
sq=SQ(a+1);
printf("sq=%d\n",sq);
}
運行結果爲:
input a number:3
sq=7
同樣輸入3,但結果卻是不一樣的。問題在哪裏呢? 這是由於代換隻作符號代換而不作其它處理而造成的。宏代換後將得到以下語句:
sq=a+1*a+1;
由於a爲3故sq的值爲7。
#define SQ(y) (y)*(y) main(){ int a,sq; printf("input a number: "); scanf("%d",&a); sq=160/SQ(a+1); printf("sq=%d\n",sq); }
本程序與前例相比,只把宏調用語句改爲:
sq=160/SQ(a+1);
運行本程序如輸入值仍爲3時,希望結果爲10。但實際運行的結果如下:
input a number:3
sq=160
爲什麼會得這樣的結果呢?分析宏調用語句,在宏代換之後變爲:
sq=160/(a+1)*(a+1);
a爲3時,由於“/”和“*”運算符優先級和結合性相同,則先作160/(3+1)得40,再作40*(3+1)最後得160。爲了得到正確答案應在宏定義中的整個字符串外加括號,程序修改如下:
#define SQ(y) ((y)*(y)) main(){ int a,sq; printf("input a number: "); scanf("%d",&a); sq=160/SQ(a+1); printf("sq=%d\n",sq); } 或者 #define SQ(y) ((y)*(y)) main(){ int a,sq; printf("input a number: "); scanf("%d",&a); sq=160/(SQ(a+1)); printf("sq=%d\n",sq); }