Как уже упоминалось в в этом ответе , printf
использует спецификаторы формата, чтобы знать, что вытолкнуть из стека (%d
равно sizeof(int)
, что в моей системе составляет 4 байта).
( Редактировать: Как указано в комментариях rici , это не обязательно будет стек (на x86
он находится в регистре ЦП большую часть время). В стандарте никогда не говорится о реализациях, и именно в этом и заключается эта проблема.)
Небольшой забавный факт: в моем окне Windows 10 было 0 и 1. В моем Xubuntu VBox это было 1 и -2132712864. Таким образом, printf
выталкивает только 4 байта, и порядок вашего компьютера портит результат. Из pow (3) manual :
#include <math.h>
double pow(double x, double y);
float powf(float x, float y);
long double powl(long double x, long double y);
Итак, чтобы получить правильный результат в обоих случаях, используйте правильный printf
спецификатор формата :
double a = pow(3546, 0);
И:
printf("%lf\n", pow(3546, 0));
Если вы хотите узнать больше о variadi c функциях (таких как printf
, которые принимают переменное количество параметров), начните с прочтения справочной страницы API .
#include <stdarg.h>
void va_start(va_list ap, last);
type va_arg(va_list ap, type);
void va_end(va_list ap);
void va_copy(va_list dest, va_list src);