Pourquoi scanf () a-t-il besoin de «% lf» pour les doublons, alors que printf () accepte uniquement «% f»?

StackOverflow https://stackoverflow.com/questions/210590

  •  03-07-2019
  •  | 
  •  

Question

Pourquoi scanf () a-t-il besoin du l dans " % lf " lors de la lecture d'un double , lorsque printf () peut utiliser " % f " que son argument soit un double ou un float ?

Exemple de code:

double d;
scanf("%lf", &d);
printf("%f", d);
Était-ce utile?

La solution

Parce que C promouvra les flottants comme doublés pour les fonctions qui prennent des arguments variables. Les pointeurs ne sont pas promus, vous devriez donc utiliser % lf , % lg ou % le (ou % la en C99) à lire en double.

Autres conseils

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

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

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

Mais il n’ya aucune raison de le faire réellement. N'utilisez pas les arguments % f pour printf de type double . C’est une habitude très répandue, née dans les années 89/90, mais c’est une mauvaise habitude. Utilisez % lf dans printf pour double et conservez % f réservé pour les arguments float .

scanf a besoin de connaître la taille des données pointées par & amp pour les remplir correctement, alors que les fonctions variadiques encouragent les flottants à doubler (vous ne savez pas trop pourquoi ), donc printf reçoit toujours un double .

Parce que sinon, scanf pensera que vous passez un pointeur sur un float dont la taille est inférieure à celle d'un double et qu'il renverra une valeur incorrecte.

L'utilisation d'une valeur float ou double dans une expression C aboutira de toute façon à une valeur double. Par conséquent, printf ne peut pas faire la différence. Alors qu’un pointeur sur un double doit être explicitement signalé à scanf comme distinct d’un pointeur à float, car ce que le pointeur pointe est ce qui compte.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top