Функция Variadic (va_arg) не работает с float, а printf работает? Какая разница?
У меня просто случилась похожая ситуация, как в этом вопросе из двух лет:
Функция Variadic (va_arg) не работает с плавающей точкой?
Там сказано, что проблема в том,содействие плавать, чтобы удвоить, когда мы называем такие вещи, как
va_arg(arg, float)
Мой вопрос находится в конце этого поста, но сначала давайте посмотрим на ответ @ Jack ниже вопроса, связанного выше:
#include <stdio.h>
#include <stdarg.h>
void foo(int n, ...)
{
va_list vl;
va_start(vl, n);
int c;
double val;
for(c = 0; c < n; c++) {
val = va_arg(vl, double);
printf("%f\n", val);
}
va_end(vl);
}
int main(void)
{
foo(2, 3.3f, 4.4f);
return 0;
}
Выход:
3.300000
4.400000
Теперь, если мы изменимval = va_arg(vl, double)
вval = va_arg(vl, float)
, мы получим (по крайней мере, я получу в MSVS 2012):
36893488147419103000.000000
2.162500
Давайте теперь перейдем к моему вопросу.
В этой теме:C / C ++ va_list неправильно возвращает аргументы наиболее проголосовавший ответ, и его комментарий говорит, чтоprintf
такжеспособствует float
кdouble
«S.
Но в чем разница? Если они оба способствуютfloat
вdouble
, Зачемprintf
записывает значения правильно, в то время какva_arg
дает нам таких носовых демонов?