Pourquoi scanf () a-t-il besoin de «% lf» pour les doublons, alors que printf () accepte uniquement «% f»?
-
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);
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
pourfloat
-
% lf
pourdouble
-
% Lf
pourlong 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
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.