本文详细介绍二级C语言考试辅导教程第九章:预处理
运行结果为:input a number:3
sq=7 同样输入3,但结果却是不一样的。问题在哪里呢? 这是由于代换只作符号代换而不作其它处理而造成的。 宏代换后将得到以下语句: sq=a+1*a+1; 由于a为3故sq的值为7。这显然与题意相违,因此参数两边的括号是不能少的。即使在参数两边加括号还是不够的,请看下面程序:
以下是引用片段:
#defineSQ(y)(y)*(y)
main(){
inta,sq;
printf("inputanumber:");
scanf("%d",&a);
sq=160/SQ(a+1);
printf("sq=%d
",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。为了得到正确答案应在宏定义中的整个字符串外加括号, 程序修改如下
以下是引用片段:
#defineSQ(y)((y)*(y))
main(){
inta,sq;
printf("inputanumber:");
scanf("%d",&a);
sq=160/SQ(a+1);
printf("sq=%d
",sq);
}
以上讨论说明,对于宏定义不仅应在参数两侧加括号, 也应在整个字符串外加括号。
5. 带参的宏和带参函数很相似,但有本质上的不同,除上面已谈到的各点外,把同一表达式用函数处理与用宏处理两者的结果有可能是不同的。main(){
来源:豆豆网转载 作者:天极网 责编:豆豆技术应用