max宏引起的杯具 - webdancer's Blog
max宏引起的杯具
程序执行的时间与估计的渐近时间出现了很大的出入,程序的结构如下:
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就没了。
参考: