5 ответов:
потому что C будет продвигать поплавки в двойники для функций, которые принимают переменные аргументы. Указатели не продвигаются ни к чему, поэтому вы должны использовать
%lf,%lgили%le(или%laв C99) читать в двойном формате.
поскольку С99 соответствие между спецификаторами формата и типами аргументов с плавающей запятой в C согласуется между
printfиscanf. Это
%fнаfloat%lfнаdouble%Lfнаlong doubleбывает так, что при аргументах типа
floatпередаются как вариативные параметры, такие аргументы неявно преобразуются в типdouble. Это причина, почему вprintfспецификаторы формата%fи%lfэквивалентны и взаимозаменяемы. Вprintfвы можете "перекрестное использование"%lfСfloatили%fСdouble.но нет никаких причин, чтобы на самом деле делать это на практике. Не используйте
%fдоprintfаргументы типаdouble. Это широко распространенная привычка, родившаяся еще в C89 / 90 раз, но это плохая привычка. Используйте%lfнаprintfнаdoubleи сохранить%fзарезервированы дляfloatаргументов.
scanfнеобходимо знать размер данных, на которые указывает&dчтобы заполнить его правильно, в то время как вариативные функции продвигают поплавки до двойников (не совсем уверен, почему), поэтомуprintfвсегда получаюdouble.
потому что в противном случае scanf будет думать, что вы передаете указатель на поплавок, который имеет меньший размер, чем двойной, и он вернет неверное значение.
использование либо плавающего, либо двойного значения в выражении C приведет к значению, которое в любом случае является двойным, поэтому printf не может сказать разницу. В то время как указатель на double должен быть явно сигнализирован scanf в отличие от указателя на float, потому что то, на что указывает указатель, имеет значение.
Comments