带参数 宏-使用括号将参数扩起来
?
#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*ymain(){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:3sq=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);}??