读书人

带参数 宏-运用括号将参数扩起来

发布时间: 2012-10-25 10:58:57 作者: rapoo

带参数 宏-使用括号将参数扩起来

?

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

?

读书人网 >编程

热点推荐