CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

宏定义函数问题

楼主renyb04(冷月孤星)2005-11-04 19:25:15 在 C/C++ / C语言 提问

一下为同一分段函数的两种不同实现,为什么  
  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

相关问题

  • 关于宏定义函数
  • 自定义函数
  • 自定义函数
  • 自定义函数
  • 自定义函数
  • 菜问题:内联函数和宏定义的区别
  • 如何把下面的两个宏定义转化为函数?
  • 关于变参函数宏定义实现,求问
  • “回调函数”的定义?
  • 函数定义问题

关键词

  • 函数
  • fun
  • 正确
  • define

得分解答快速导航

  • 帖主:renyb04
  • arrowcy

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo