Функция 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 дает нам таких носовых демонов?

Ответы на вопрос(4)

Ваш ответ на вопрос