宏定义函数问题
一下为同一分段函数的两种不同实现,为什么
FUN (0)时就报错
fun (0)时就正确
而且从语法上讲应当是正确的
#define FUN(x) x<0 ? 1/x:0
float fun(float x)
{
return x<0 ? 1/x:0;
}
问题点数:20、回复次数:16Top
1 楼csucdl(csucdl)回复于 2005-11-04 19:38:26 得分 0
0 < 0: 1 / 0:0
注意0不能为分母
Top
2 楼arrowcy(长弓手)回复于 2005-11-04 19:40:55 得分 0
因为宏替换后
x<0 ? 1/x:0
就成了x<0? 1/0:0
1/0就出错了Top
3 楼arrowcy(长弓手)回复于 2005-11-04 19:46:33 得分 20
函数那个就是按照求值的顺序,先求x<0是否成立,不成立就没有去执行1/0了,而且就算你把x<0换成了x<=0,也是在运行期间才会提示错误的。
而宏替换则是在编译前的预处理阶段就完成了替换,编译的时候编译器就会发现1/0这个错误了
所以你仔细观察错误的提示,应该是还处在compling这几个字之后,linking之前,所以编译就不能通过Top
4 楼2004csharp()回复于 2005-11-04 20:49:18 得分 0
你试着将宏中的参数加括号:
FUN (0)时就报错
fun (0)时就正确
而且从语法上讲应当是正确的
#define FUN(x) ((x)<0 ? 1/(x):0)
float fun(float x)
{
return x<0 ? 1/x:0;
}
Top
5 楼renyb04(冷月孤星)回复于 2005-11-04 21:29:05 得分 0
那应当怎么书写这个宏定义Top
6 楼agaric(蘑菇星星)回复于 2005-11-04 21:33:26 得分 0
有种东西 叫做括号Top
7 楼MooseWOler(Mr.Oler)回复于 2005-11-04 21:45:30 得分 0
TC++ 3.0编译通过 无错 程序如下
------------------------------------------------------------------------
#include <stdio.h>
#define FUN(x) x<0?1/x:0
float fun(float x)
{
return x<0?1/x:0;
}
main()
{
float r,x=5;
r=FUN(x);
printf("%.2f",r);
r=fun(x);
printf("%.2f",r);
}Top
8 楼MooseWOler(Mr.Oler)回复于 2005-11-04 21:48:04 得分 0
运行的几组结果:
初值:5
结果:0.000.00
初值:-4
结果:-0.25-0.25
初值:0
结果:0.000.00Top
9 楼austerity(世界尽头)回复于 2005-11-04 22:21:25 得分 0
在哪里加了括号啊,感觉没有变化啊Top
10 楼ugg(逸学堂(exuetang.net))回复于 2005-11-04 22:33:27 得分 0
在哪里加了括号啊,感觉没有变化啊
++fun(x);
试一试这种形式,就知道括号的作用了!
宏定义时,必须给他的每个元素加括号,
不然问题很多阿!Top
11 楼MooseWOler(Mr.Oler)回复于 2005-11-05 09:34:13 得分 0
ugg(小问题大道理) ( ) 信誉:100 2005-11-04 22:33:00 得分: 0
...
++fun(x);
试一试这种形式,就知道括号的作用了!
宏定义时,必须给他的每个元素加括号,
不然问题很多阿!
----------------------------------------------------------------------
++fun(x)
想好了再写出来,这会引起lvalue错误的!!
本人的意见是,只要不会引起歧义,并且对运算符的优先级理解得很好,
不加括号也是可以的
但是在模糊不清的情况,或者自己不能断定run-time时的情况,最好加上括号
我用楼主的程序在TC++3.0下运行通过,结果见上
请问楼主使用的编译器版本?Top
12 楼yclr(雪阳)回复于 2005-11-05 21:42:44 得分 0
括号的作用
在宏定义中有很大的区别哦Top
13 楼renyb04(冷月孤星)回复于 2005-11-06 22:30:57 得分 0
#include <stdio.h>
#define FUN(x) x<0?1/x:0
float fun(float x)
{
return x<0?1/x:0;
}
main()
{
float r;
r=FUN(0);
printf("%.2f",r);
}
这样去试肯定过不去
Top
14 楼sjchao(阳光流溢)回复于 2005-11-07 10:15:46 得分 0
宏定义中有运算的时候,括号一定不要省略Top
15 楼renyb04(冷月孤星)回复于 2005-11-07 13:15:59 得分 0
#define FUN(X) {(X<0)?(1/X):0;}
就是这样定义也过不去Top
16 楼wuwen19(按时打发)回复于 2005-11-07 16:00:08 得分 0
#define FUN(X) (X)<0?1/(X):0
Top




