Зачем scanf() нужен "%lf" для двойников, когда printf () в порядке только с "%f"?



почему scanf() нужны l в "%lf" при чтении double, когда printf() можно использовать "%f" независимо от того, является ли его аргумент double или float?



пример кода:



double d;
scanf("%lf", &d);
printf("%f", d);
10375   5  

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

    Ничего не найдено.