2009-09-05 5 views
0

Je voulais demander si l'instruction suivante où printf() a été fournie avec un type int où elle s'attendait à ce qu'un type char invoque UN COMPORTEMENT NON DÉFINI. Sinon, quelle est exactement la démarche à suivre pour le rendre compatible avec le type attendu. Est-ce que a sera raccourci au type de caractère?différence dans le type d'argument attendu et argument fourni dans printf

int a = 65; 
    printf("%c", a); 

Répondre

3

arguments variables sont soumis à la promotion de l'argument par défaut, par exemple char sera promu int, float à double (c'est la raison pour laquelle vous avez seulement un spécificateur de format unique pour imprimer à la fois simples et les valeurs doubles à virgule flottante précision). Passer un int au lieu d'un char est parfaitement valide et même souhaitable, car les caractères littéraux sont de type int de toute façon. Conformément à la spécification C99, section 7.19.6.1 §8, en voyant le spécificateur de conversion %c, printf() s'attend à un argument de type int et continuera ensuite et porter cette valeur à unsigned char.

Cela signifie que le suivant est garantie à la sortie a, comme la conversion de signature à des types non signés est bien défini:

int a = 'a' + UCHAR_MAX + 1; 
printf("%c", a); 
+0

Shorter types sont promus à plus, et non pas en face. Et où est-il défini que les littéraux de caractère sont des ints, pas des caractères? – qrdl

+0

@qrdl: ISO C99, section 6.4.4.4 §10: "Une constante de type entier a le type int."; aussi, où ai-je dit qu'un type plus long est promu à un plus court? – Christoph

+0

@Christoph Désolé, je me trompe sur les littéraux à caractère unique. Les littéraux à plusieurs caractères sont définis par l'implémentation (comme spécifié par C99 section 6.4.4.4), mais les littéraux à caractère unique sont en effet ints. J'ai compris votre affirmation "passer un int au lieu d'un caractère est parfaitement valide" comme "int est promu char", mais dans ce contexte, cela ne voulait pas dire ça, mon mal. Je l'écrirais différemment - "en voyant% c printf() attend int et le jette à un entier non signé, un spécifié par la section 7.19.6.1 §8 de C99" – qrdl

Questions connexes