История изменений
Исправление 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