一个求n个数的最大值的模板函数,对于float何double,运行结果不同,大家看下~~~

blldw 2007-09-17 12:45:28
模板代码如下:
template <class T> T maxn(int num, T first, ...)
{
int i = 1;
T tmax = first;
va_list ap;
va_start(ap, first);
while (i++ < num)
{
T tmp = va_arg(ap, T);
if (tmp > tmax)
tmax = tmp;
}
va_end(ap);

return tmax;
}

程序运行结果显示:
maxn(4, 1.23f, 3.21f, 6.22f, 4.33f) = 2.15125;
maxn(4, 1.23, 3.21, 6.22, 4.33) = 6.22;
请问为什么对于第一个maxn(4, 1.23f, 3.21f, 6.22f, 4.33f)结果为什么不是6.22.
谢谢~~~
...全文
263 点赞 收藏 9
写回复
9 条回复
www_adintr_com 2007年09月17日
float 作为函数参数默认会转化为 double 的,除非函数的申明处指明了接受 float 型。
你的列子中只有 first 参数才指明了类型,其它是不定类型,被转换成 double 了。
回复 点赞
FingerStyle 2007年09月17日
maxn(4f, 1.23f, 3.21f, 6.22f, 4.33f) = 2.15125;
加上 f
回复 点赞
howardneil2007 2007年09月17日
很奇怪
关注
回复 点赞
blldw 2007年09月17日
是不是这么回事哦?
回复 点赞
w_anthony 2007年09月17日
支持adlay(www.adintr.com)(无可奈何天) 的观点!
至于zyx040404() 说的后面声明成double的问题,如果后面声明成double,那么va_arg(ap, T)要变成va_arg(ap, double)了,不然肯定还是相同的结果,你可以试试template <class T> T maxn(int num, T first, T,T,T...),这样就是6.22。
关键的问题,还是压入8字节,读取却只有4字节的引起的。
回复 点赞
www_adintr_com 2007年09月17日
adlay(www.adintr.com)(无可奈何天) 说的也不完全正确
如果你把first设成float,其他显示声明成double也是一样的结果
我猜想是不是va_start或者va_arg有什么bug

------------------------------------------------------

你显示声明为 double 却当作 float 来取当然结果是一样的了! 现在没显示申明也是被转换成了 double 的。 你显示申明为 T 或者 float 就对了。
回复 点赞
taodm 2007年09月17日
你还是在调试模式下看汇编吧。
你看看传参数时,压栈多少字节吧。
float在传参时,恐怕强制升级到double了吧。
不要使用不定参数函数,水是比较深的。
回复 点赞
zyx040404 2007年09月17日
adlay(www.adintr.com)(无可奈何天) 说的也不完全正确
如果你把first设成float,其他显示声明成double也是一样的结果
我猜想是不是va_start或者va_arg有什么bug
回复 点赞
zyx040404 2007年09月17日
调试了一下代码,是很奇怪,
T tmp = va_arg(ap, T); 有些值tmp为0.00000
回复 点赞
发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告