正在加载图片...
4.在宏定义中,字符串内的形参通常要用括号括起来以避免出错。在上例中的宏定义中 (y)*(y)表达式的y都用括号括起来,因此结果是正确的。如果去掉括号,把程序改为以下形 【例9. #define sQ(y) yay maino( int a, Sq: printf( input a number scanf( %d", &a) q=SQ(a+1); printf("sq=%d\n", sg) 运行结果为 input a number: 3 同样输入3,但结果却是不一样的。问题在哪里呢?这是由于代换只作符号代换而不作 其它处理而造成的。宏代换后将得到以下语句: sq=a+1*a+1 由于a为3故sq的值为7。这显然与题意相违,因此参数两边的括号是不能少的。即使 在参数两边加括号还是不够的,请看下面程序 【例9.7】 #define sQ(y)(y)*(y) int a, Sq: printf( input a number: scanf(%d", &a) sq=160/SQ(a+1) printf("sq=%d\n", sg) 本程序与前例相比,只把宏调用语句改为 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。为了得到正确答案应在宏定义中的整个字符串外加括号,程序修改如下: 【例9.8】 #define sQ(y)((y)*(y))4. 在宏定义中,字符串内的形参通常要用括号括起来以避免出错。在上例中的宏定义中 (y)*(y)表达式的 y 都用括号括起来,因此结果是正确的。如果去掉括号,把程序改为以下形 式: 【例 9.6】 #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。这显然与题意相违,因此参数两边的括号是不能少的。即使 在参数两边加括号还是不够的,请看下面程序: 【例 9.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。为了得到正确答案应在宏定义中的整个字符串外加括号,程序修改如下: 【例 9.8】 #define SQ(y) ((y)*(y))
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有