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?
%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
.
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.
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).
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.
#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;
}