#include <stdio.h>
int main() {
char a = 'A';
int b = 90000;
float c = 6.5;
printf("%d ",sizeof(6.5));
printf("%d ",sizeof(90000));
printf("%d ",sizeof('A'));
printf("%d ",sizeof(c));
printf("%d ",sizeof(b));
printf("%d",sizeof(a));
return 0;
}
La sortie est:
8 4 4 4 4 1
Pourquoi la sortie est-elle différente pour les mêmes valeurs?
6.5
n'est pas un flotteur, c'est undouble
printf("%d",sizeof(6.5f));
pour en faire unfloat
.printf("%zu", sizeof(6.5));
Réponses:
Les constantes de caractères en C (opposées à C ++) ont le type
int
. Donc cet appelsorties 4. C'est
sizeof( 'A' )
égal àsizeof( int )
.De la norme C (6.4.4.4 Constantes de caractères)
En revanche (6.5.3.4 Les opérateurs sizeof et alignof)
Ainsi, l'opérande de l'
sizeof
opérateur dans cette expressionsizeof( 'A' )
a le type int tandis que dans cette expressionsizeof( a )
où a est déclaré commel'opérande a le type
char
.Faites attention à ces appels comme celui-ci
utilisez un spécificateur de format de conversion incorrect. Vous devez écrire
Dans l'appel ci-dessus, une constante du type est utilisée
double
lors de cet appella variable
c
a le typefloat
.Vous pouvez obtenir le même résultat pour ces appels si le premier appel utilise une constante de type float comme
la source
Les constantes, comme les variables, ont un type qui leur est propre:
6.5
: Une constante à virgule flottante de typedouble
90000
: Une constante entière de typeint
(siint
est 32 bits) oulong
(siint
est 16 bits)'A'
: Une constante de caractère de typeint
en C etchar
en C ++Les tailles imprimées sont les tailles des types ci-dessus.
De plus, le résultat de l'
sizeof
opérateur est de typesize_t
. Donc, lors de l'impression, le spécificateur de format approprié à utiliser ne l'est%zu
pas%d
.la source
Parce que les valeurs ne comptent pas
sizeof
. C'est la taille des types.les constantes de caractère sont
int
s, paschar
s.les constantes à virgule flottante sont par défaut
double
s sauf si vous les suffixez avecf
oul
.la source