printf trop intelligent casting de char à int?

Pourquoi l’appel suivant:

printf("%d %d", 'a', 'b'); 

donner les valeurs “correctes” 97 98 ? % d indique que la fonction doit lire 4 octets de données et printf ne devrait pas être en mesure d’indiquer le type des arguments reçus (en plus de la chaîne de formatage), alors pourquoi le numéro imprimé n’est-il pas |a||b||junk||junk| ?

Merci d’avance.

Dans ce cas, les parameters reçus par printf seront de type int .

Tout d’abord, tout ce que vous transmettez à printf (à l’exception du premier paramètre) est soumis à des “promotions par défaut”, ce qui signifie (entre autres) que char et short sont tous deux promus en int avant d’être passés. Donc, même si ce que vous passiez avait réellement le type char, au moment où il est arrivé à printf il aurait eu le type int . Dans votre cas, vous utilisez un littéral de caractère, qui a déjà le type int toute façon.

Il en va de même avec scanf et d’autres fonctions utilisant des parameters variadiques.

Deuxièmement, même sans promotions par défaut, les littéraux de caractères en C ont déjà le type int toute façon (§6.4.4.4 / 10):

Une constante de caractère entier a le type int.

Ainsi, dans ce cas, les valeurs commencent par le type int et ne sont pas promues – mais même si vous avez commencé avec char s, quelque chose comme:

 char a = 'a'; printf("%d", a); 

… ce que printf reçoit serait de type int , pas de type char toute façon.

En C , un littéral est une valeur de type int .

il imprime le DEC ASCII pour les caractères que vous avez entrés.