C++ 当我使用变量参数时,它可以很好地处理int和double,但是当涉及到float时,就会发生错误

C++ 当我使用变量参数时,它可以很好地处理int和double,但是当涉及到float时,就会发生错误,c++,c,visual-studio-2008,visual-c++,c++11,C++,C,Visual Studio 2008,Visual C++,C++11,当我使用变量参数时,它可以很好地处理int和double,但是当涉及到float时,就会发生错误 这是代码 void vaParamTest(int a, ...) { va_list ap; va_start(ap, a); for (int i = 0; i < a; i++) printf("%f\t", va_arg(ap, float)); putchar('\n'); va_end(ap); } 作为变量函数参数传递的

当我使用变量参数时,它可以很好地处理int和double,但是当涉及到float时,就会发生错误

这是代码

void vaParamTest(int a, ...)
{
    va_list ap;
    va_start(ap, a);
    for (int  i = 0; i < a; i++)
        printf("%f\t", va_arg(ap, float));
    putchar('\n');
    va_end(ap);
}

作为变量函数参数传递的变量是默认提升的,这会使所有浮点变成双精度。你永远不会有一个像这样的浮点参数。在printf中,%f总是表示双精度。

这毫无意义。但是你得到了什么错误信息?什么输出?我的意思是,你得到了一些东西,对吗?你可能想解释一个机器人更多关于什么错误发生。。。编译错误?运行时错误?输出不是预期的?我怀疑最后一个,因为第一个论点不是浮点数。非常感谢你的帮助,但现在我更困惑了。我在您的链接中找到了此段落[6.5.2.2]。显然,整数促销的描述是毫无疑问的。将字符s传递给函数(例如,void paramStackchar x、char y、char z)时,所有字符s都是4个字节。但是,对于双重提升,float x,float y,float z,所有的float都需要4个字节,而不像double那样需要8个字节。我可以找到这样的,&x:0x0040fe10&y:0x0040fe14&z:0x0040fe18在这个函数中会发生双重提升吗?@Robert-不,这都是关于。。。部分规则是不同的,因为编译器不知道预期的类型。@Bo Persson-谢谢。只有当给定参数没有参数时,才会发生双重提升,但对于普通函数调用,另一个规则会起作用,对吗?@Robert-是的,当参数类型已知时,如果需要,参数会提升为该类型。这个是特殊的,所以它有特殊的规则。@Robert:在某些情况下,值会被默认提升。作为一个可变参数,即匹配省略号就是这样一个时间。默认提升需要将浮点值转换为双精度值并作为双精度值传递。一个普通的原型函数,比如void fchar,float,short;仍然像预期的那样工作!链接的问题集中在整体默认升级上,因此关于浮动到双倍的部分可能没有提到,尽管它在标准中很接近。
vaParamTest(3, 3.5f, 8.3f, 5.1f);