178 votes

Pourquoi scanf() a-t-il besoin de "%lf" pour les doubles, alors que printf() peut se contenter de "%f" ?

Pourquoi est-ce que scanf() besoins de l l en " %lf " lors de la lecture d'un double quand printf() peut utiliser " %f ", indépendamment du fait que son argument soit un double ou un float ?

Exemple de code :

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

204voto

MSN Points 30386

Parce que le C va promouvoir les floats en doubles pour les fonctions qui prennent des arguments variables. Les pointeurs ne sont pas promus à quoi que ce soit, donc vous devriez utiliser %lf , %lg o %le (ou %la en C99) pour lire en double.

31voto

AndreyT Points 139512

Depuis 99, la correspondance entre les spécificateurs de format et les types d'arguments en virgule flottante en C est cohérente entre printf y scanf . Il est

  • %f para float
  • %lf para double
  • %Lf para long double

Il se trouve que lorsque les arguments de type float sont passés en tant que paramètres variadiques, ces arguments sont implicitement convertis au type double . C'est la raison pour laquelle dans printf spécificateurs de format %f y %lf sont équivalents et interchangeables. Dans printf vous pouvez faire une "utilisation croisée" %lf con float o %f con double .

Mais il n'y a aucune raison de le faire en pratique. N'utilisez pas %f a printf arguments de type double . C'est une habitude répandue, née à l'époque de C89/90, mais c'est une mauvaise habitude. Utilisez %lf en printf para double et garder %f réservé pour float arguments.

16voto

Tanktalus Points 7940

scanf a besoin de connaître la taille de la donnée pointée par &d pour le remplir correctement, alors que les fonctions variadiques font passer les flottants en doubles (on ne sait pas vraiment pourquoi). printf est toujours en train de recevoir un double .

7voto

Jim Buck Points 10839

Parce que sinon scanf pensera que vous passez un pointeur à un float qui est une taille plus petite qu'un double, et il retournera une valeur incorrecte.

2voto

fcw Points 1164

L'utilisation d'une valeur flottante ou double dans une expression C donnera de toute façon une valeur double, de sorte que printf ne peut pas faire la différence. Alors qu'un pointeur vers un double doit être explicitement signalé à scanf comme étant distinct d'un pointeur vers un flottant, parce que ce vers quoi pointe le pointeur est ce qui compte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X