LINUX.ORG.RU

История изменений

Исправление vodz, (текущая версия) :

Считается столько, сколько указано в спецификаторе типа printf. Поэтому, если спецификатор не соответствует реальной переменной, то будет или мусор, или ругань компилятора.

Действительность намного интереснее.

#include <stdio.h>
#include <math.h>
#include <stdarg.h>

static void foo_f(const char *fmt, ...)
{
        va_list p;
        va_start(p, fmt);

        double d = va_arg(p, double);
        printf(fmt, d);
}

static void foo_d(const char *fmt, float f)
{
        printf(fmt, f);
}

int main(void)
{
        foo_f("%.25f\n", (float)'1');
        foo_f("%.25f\n", (float)M_PI);
        foo_f("%.25f\n", M_PI);
        foo_d("%.25f\n", (float)M_PI);
        foo_d("%f\n", M_PI);
        foo_d("%.25f\n", M_PI);
        return 0;
}
$ ./a.out
49.0000000000000000000000000
3.1415927410125732421875000
3.1415926535897931159979635
3.1415927410125732421875000
3.141593
3.1415927410125732421875000
И никакого мусора.

Исправление vodz, :

Считается столько, сколько указано в спецификаторе типа printf. Поэтому, если спецификатор не соответствует реальной переменной, то будет или мусор, или ругань компилятора.

Действительность намного интереснее.

#include <stdio.h>
#include <math.h>
#include <stdarg.h>

static void foo_f(const char *fmt, ...)
{
        va_list p;
        va_start(p, fmt);

        double d = va_arg(p, double);
        printf(fmt, d);
}

static void foo_d(const char *fmt, float f)
{
        printf(fmt, f);
}

int main(void)
{
        foo_f("%.25f\n", (float)'1');
        foo_f("%.25f\n", (float)M_PI);
        foo_f("%.25f\n", M_PI);
        foo_d("%.25f\n", (float)M_PI);
        foo_d("%f\n", M_PI);
        foo_d("%.25f\n", M_PI);
        return 0;
}
$ ./a.out
49.0000000000000000000000000
3.1415927410125732421875000
3.1415926535897931159979635
49.0000000000000000000000000
3.1415927410125732421875000
3.141593
3.1415927410125732421875000
И никакого мусора.

Исходная версия vodz, :

Считается столько, сколько указано в спецификаторе типа printf. Поэтому, если спецификатор не соответствует реальной переменной, то будет или мусор, или ругань компилятора.

Действительность намного интереснее.

#include <stdio.h>
#include <math.h>
#include <stdarg.h>

static void foo_f(const char *fmt, ...)
{
        va_list p;
        va_start(p, fmt);

        double d = va_arg(p, double);
        printf(fmt, d);
}

static void foo_d(const char *fmt, float f)
{
        printf(fmt, f);
}

int main(void)
{
        foo_f("%.25f\n", (float)'1');
        foo_f("%.25f\n", (float)M_PI);
        foo_f("%.25f\n", M_PI);
        foo_d("%.25f\n", (float)M_PI);
        foo_d("%f\n", M_PI);
        foo_d("%.25f\n", M_PI);
        return 0;
}
$ ./a.out
49.0000000000000000000000000
3.1415927410125732421875000
3.1415926535897931159979635
49.0000000000000000000000000
3.1415927410125732421875000
3.141593
3.1415927410125732421875000
Обратите внимание на последний результат. Точность double, но декларация — float. И никакого мусора.