max宏引起的杯具 - webdancer's Blog

max宏引起的杯具

webdancer posted @ 2011年10月02日 01:42 in 编程语言 with tags c , 1325 阅读

程序执行的时间与估计的渐近时间出现了很大的出入,程序的结构如下:

float maxsubarr3(int l,int u){
    ......//省略
    return max(lmax+rmax,max(maxsubarr3(l,m),maxsubarr3(m+1,u)));
}

问题在max定义上,我用宏定义了max,如下:

#define max(a,b) ((a)>(b)?(a):(b))

忽视了宏替换的一个缺陷:作为参数的表达式重复计算了两次。而且本身参数是递归定义函数,时间的开销就会增长巨大,导致了在数量级到达5的时候,程序就无法运行了。

明确了问题所在,那就可以更正了。解决的方法:

1.将宏定义改为函数定义。

float max(float a,float b){
    return a>b?a:b;
}

2.更正宏定义的方式。

 #define max(a,b) \
   ({ __typeof__ (a) _a = (a); \
       __typeof__ (b) _b = (b); \
     _a > _b ? _a : _b; })

 使用函数定义后,bug就没了。

参考:

http://stackoverflow.com/questions/3437404/min-and-max-in-c


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter
Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee