帶參數 宏-使用括號將參數擴起來

 

#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);
}
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章