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

一个求n个数的最大值的模板函数,对于float何double,运行结果不同,大家看下~~~
模板代码如下:
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.
谢谢~~~

------解决方案--------------------
很奇怪
关注
------解决方案--------------------
maxn(4f, 1.23f, 3.21f, 6.22f, 4.33f) = 2.15125;
加上 f

------解决方案--------------------
float 作为函数参数默认会转化为 double 的,除非函数的申明处指明了接受 float 型。
你的列子中只有 first 参数才指明了类型,其它是不定类型,被转换成 double 了。
------解决方案--------------------
调试了一下代码,是很奇怪,
T tmp = va_arg(ap, T); 有些值tmp为0.00000
------解决方案--------------------
adlay(www.adintr.com)(无可奈何天) 说的也不完全正确
如果你把first设成float,其他显示声明成double也是一样的结果
我猜想是不是va_start或者va_arg有什么bug
------解决方案--------------------
你还是在调试模式下看汇编吧。
你看看传参数时,压栈多少字节吧。
float在传参时,恐怕强制升级到double了吧。
不要使用不定参数函数,水是比较深的。
------解决方案--------------------
支持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字节的引起的。