Pourquoi l'appel suivant:
printf("%d %d", 'a', 'b');
3 Réponses :
Dans ce cas, les paramètres reçus par Tout d'abord, tout ce que vous passez à imprimer (sauf le premier paramètre) Sousge "Promotions par défaut", ce qui signifie (entre autres) que Il en va de même avec Scanf et d'autres fonctions qui prennent des paramètres variadiques. p> second, même sans promotion par défaut, les littéraux de caractères en C ont déjà type Une constante de caractère entier a le type INT. P>
blockquote> Donc, dans ce cas, les valeurs commencent par type ... Qu'est-ce que printf code> seront de type
int code>.
Char code> et
court-court code> sont tous deux favorisés à
int code> avant d'être passé. Donc, même si ce que vous passiez a vraiment fait de type caractère, au moment où il est arrivé à
printf code> il aurait le type
int code>. Dans votre cas, vous utilisez un littéral de caractère, qui a déjà du type
int code> de toute façon. P>
int code> de toute façon (§6.4.4.4 / 10): P>
int code>, et ne sont pas promus - mais même si vous avez commencé avec
Char code> S, quelque chose Comme: p>
printf code> serait de type
int code>, pas de type
char < / code> quand même. p> p>
Promotions par défaut? Vraiment? Depuis quand les varargs font-elles des promotions par défaut? N'est-ce pas juste que le type d'un littéral de caractère est int code>?
Oui et non - oui, un type de type int code>, mais même s'il l'a attribué à un
char code> et est passé que,
printf code> serait Recevez toujours un
INT code>, il est donc à peu près pertinent.
Aucune promotion ne se passe ici. 'A' code> et
'B' code> ayez le type
int code> dans C.
@R: Gee, merci! Je suis sûr que personne d'autre ici a remarqué quoi que ce soit comme ça. Sous-titrage fermé pour l'humour altéré i>: Si "@R" avait pris la peine de lire les commentaires précédents, il veillé à ce que tout le monde ait remarqué qu'il y a des semaines - et que j'ai déjà souligné que / comment hors du sujet.
@R .. votre point m'a forcé à poser une autre question: pourquoi printf ("% d", (char) 'a'); code> fonctionne bien?
printf code> contourner la coercition de contourne-t-il aussi? Do éclaire. :)
@Chaz: les appels vers des fonctions variadiques soumettent tous les arguments variadiques sur Parfumions par défaut i>, qui favorisent tous les types d'entiers avec rang inférieur à int code> à
int code> ou
non signé INT code> et promouvoir
float code> à
double code>. Il est fondamentalement impossible de passer un
char code> comme argument variadique.
@R .. alors dois-je supposer que Promotions i> se passe ici?
Dans le cas de printf ("% d", (char) 'a'); code>, les promotions par défaut, qui seraient peut-être mieux décrites comme Les promotions obligatoires i>, aboutir à Le
Char code> -Type Expression
(char) 'a' a ' code> être promu à
int code> avant d'être passé sur
printf code>. Dans le cas de
printf ("% d", 'a'); code>,
'a' code> a simplement le type
int code> pour commencer.
Voici un lien de référence (voir la section "Conversions par défaut"): en.cppreference.com/ W / CPP / Langue / Variadic_Arguments
in C code>, un charcutéal est une valeur de type
int code>. p>
Il imprime l'ASCI DEC pour les caractères entrés par vous. P>
% D est un entier signé, ne dit rien sur le nombre d'octets impliqués ...
@Leppie: Cependant, il doit être transmis avec un nombre définitif d'octets, et
printf code> doit choisir un certain nombre d'octets de la pile pour cela, et ces chiffres doivent être identiques.
'a' code> a type
int code> pas
char code>.