Stałe znakowe w C (przeciwne do C ++) mają typ int
. Więc to połączenie
printf("%d",sizeof('A'));
wyjścia 4. To sizeof( 'A' )
jest równe sizeof( int )
.
Ze standardu C (6.4.4.4 Stałe znaków)
10 Stała znakowa liczby całkowitej ma typ int ....
Z drugiej strony (6.5.3.4 Wielkość i wyrównanie operatorów)
4 Po zastosowaniu sizeof do argumentu typu char, unsigned char lub podpisanego char (lub jego wersji kwalifikowanej) wynik wynosi 1.
Tak więc operand sizeof
operatora w tym wyrażeniu sizeof( 'A' )
ma typ int, podczas gdy w tym wyrażeniu, sizeof( a )
gdzie a jest zadeklarowane jak
char a = 'A';
operand ma typ char
.
Zwróć uwagę na takie połączenia
printf("%d",sizeof(6.5));
użyj niepoprawnego specyfikatora formatu konwersji. Musisz pisać
printf("%zu",sizeof(6.5));
Również w powyższym wywołaniu używana jest stała tego typu double
podczas tego wywołania
printf("%zu",sizeof(c));
zmienna c
ma typ float
.
Możesz uzyskać taki sam wynik dla tych wywołań, jeśli pierwsze wywołanie użyje stałej typu float jak
printf("%zu",sizeof(6.5f));
6.5
to nie jest pływak, todouble