web-dev-qa-db-fra.com

Impression d'un caractère avec printf

Ces deux codes sont-ils les mêmes

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

Imprime-t-il une valeur de déchets?

Je suis confus à ce sujet

printf("%d", '\0'); 

Est-ce que cela imprimera 0 ou une valeur de déchets? Parce que quand je fais ça

printf("%d", sizeof('\n')); 

Il affiche 4. Pourquoi sizeof('\n') 4 octets? La même chose en C++ imprime 1 octet. Pourquoi donc?

Voici donc la question principale

en langage c est printf("%d", '\0') censé imprimer 0

et en C++ printf("%d", '\0') censé imprimer les ordures?

18
user535450

%d Imprime un entier: il imprimera la représentation ascii de votre personnage. Vous avez besoin de %c:

printf("%c", ch);

printf("%d", '\0'); affiche la représentation ascii de '\0', qui est 0 (en échappant 0 vous dites au compilateur d'utiliser la valeur ascii 0.

printf("%d", sizeof('\n')); affiche 4 car un littéral de caractère est un int, en C, et non un char.

36
peoro

Ceci est censé afficher la valeur ASCII du caractère, car %d Est la séquence d'échappement d'un entier. Ainsi, la valeur donnée comme argument de printf est pris comme entier lors de l'impression.

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

Il en va de même pour printf("%d", '\0');, où le caractère NULL est interprété comme l'entier 0.

Enfin, sizeof('\n') est 4 car en C, cette notation pour les caractères représente l'entier correspondant ASCII. Donc '\ n' équivaut à 10 comme entier.

Tout dépend de l'interprétation que vous donnez aux octets.

8
scoffey

En C, les expressions de constantes de caractères telles que '\n' Ou 'a' Ont le type int (donc sizeof '\n' == sizeof (int)), tandis qu'en C++ elles ont le type char.

L'instruction printf("%d", '\0'); doit simplement afficher 0; le type de l'expression '\0' est int et sa valeur est 0.

L'instruction printf("%d", ch); doit afficher le codage entier de la valeur dans ch (pour ASCII, 'a' == 97).

6
John Bode

En C char est promu int dans les expressions. Cela explique à peu près toutes les questions, si vous y réfléchissez.

Source: Le langage de programmation C par Brian W.Kernighan et Dennis M.Ritchie

A lire absolument si vous voulez apprendre le C.

Voir aussi cette page de débordement de pile , où les gens beaucoup plus expérimentés que moi peuvent l'expliquer bien mieux que jamais.

5
orlp
#include <stdio.h>
#include <stdlib.h>

int func(char a, char b, char c) /* demonstration that char on stack is promoted to int !!!
                                    note: this promotion is NOT integer promotion, but promotion during handling of the stack. don't confuse the two */
{
  const char *p = &a;
  printf("a=%d\n"
         "b=%d\n"
         "c=%d\n", *p, p[-(int)sizeof(int)], p[-(int)sizeof(int) * 2]); // don't do this. might probably work on x86 with gcc (but again: don't do this)
}


int main(void)
{
  func(1, 2, 3);

  //printf with %d treats its argument as int (argument must be int or smaller -> works because of conversion to int when on stack -- see demo above)
  printf("%d, %d, %d\n", (long long) 1, 2, 3); // don't do this! Argument must be int or smaller type (like char... which is converted to int when on the stack -- see above)



  // backslash followed by number is a oct VALUE
  printf("%d\n", '\377');             /* prints -1   -> IF char is signed char: char literal has all bits set and is thus value -1.
                                                     -> char literal is then integer promoted to int. (this promotion has nothing to do with the stack. don't confuse the two!!!) */
                                      /* prints 255  -> IF char is unsigned char: char literal has all bits set and is thus value 255.
                                                     -> char literal is then integer promoted to int */


  // backslash followed by x is a hex VALUE
  printf("%d\n", '\xff');             /* prints -1   -> IF char is signed char: char literal has all bits set and is thus value -1.
                                                     -> char literal is then integer promoted to int */
                                      /* prints 255  -> IF char is unsigned char: char literal has all bits set and is thus value 255.
                                                     -> char literal is then integer promoted to int */


  printf("%d\n", 255);                // prints 255


  printf("%d\n", (char)255);          // prints -1   -> 255 is cast to char where it is -1
  printf("%d\n", '\n');               // prints 10   -> Ascii newline has VALUE 10. The char 10 is integer promoted to int 10
  printf("%d\n", sizeof('\n'));       // prints 4    -> Ascii newline is char, but integer promoted to int. And sizeof(int) is 4 (on many architectures)
  printf("%d\n", sizeof((char)'\n')); // prints 1    -> Switch off integer promotion via cast!

  return 0;
}
3
spinooosa