Différence entre “3” et “3” en C

J’ai essayé d’exécuter le programme suivant en C et j’ai obtenu quelques résultats. Pouvez-vous m’aider pourquoi ???

#include int main() { char x='A'; printf("%d%d%d",sizeof("3"),sizeof('3'),sizeof(3)); return 0; } 

La sortie reçue est 2 4 4 en utilisant gcc dans ubuntu 11.04 32 bits.

De même dans un autre programme: –

 #include int main() { char x='A'; printf("%d%d",sizeof('A'),sizeof(x)); return 0; } 

La sortie reçue est 4 1 en utilisant GCC dans Ubuntu 11.04 32 bits.

Pouvez-vous m’aider pourquoi la sortie est de cette façon ???

En C, les littéraux de caractères sont de type entier, donc sizeof('3') == sizeof(int) . Voir cette FAQ C pour plus de détails.

C’est l’un des domaines où C et C ++ diffèrent (en C ++, sizeof('3') vaut 1 ).

En fait, en corrigeant mon assertion précédente, sizeof("3") donnera 2 parce que “3” est traité comme un tableau de caractères à 2 éléments.

6.3.2.1/3

Sauf s’il s’agit de l’opérande de l’opérateur sizeof ou de l’ opérateur unaire &, ou s’il s’agit d’ un littéral utilisé pour initialiser un tableau, une expression de type ” tableau de type ” est convertie en une expression de type ” pointeur sur type ” qui pointe sur l’élément initial de l’object tableau et n’est pas une valeur.

En C

3 : littéral entier, type int
'3' : caractère littéral, type int
"3" : littéral de chaîne: type char[2]

Dans votre deuxième exemple, x désigne un object de type char .

Le ‘3’ est converti en type int, qui est de 4 octets. Cependant “3” est une chaîne de deux octets. Le premier octet est le caractère 3 et le second est le terminateur nul qui est ajouté à toutes les chaînes.

“C” est

 char myssortingng[2]; myssortingng[0] = 'C'; myssortingng[1] = '\0'; 

Alors que ‘C’ est

 int mychar; mychar = 'C'; 

'3' est une constante de caractère. En C, les constantes de caractère ont le type int (en C ++, elles ont le type char ). Ainsi, sizeof '3' == sizeof (int) .

"3" est un littéral de chaîne. C’est un tableau de char 2 éléments ( const char en C ++) avec les valeurs {'3', '\0'} . sizeof (char) == 1 par définition, donc sizeof "3" == 2.

3 est une constante entière. Il a le type int . Ainsi, sizeof 3 == sizeof (int) .

La variable x est déclarée en tant que caractère, donc sizeof x == 1.