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 sizeofoperatora 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 doublepodczas tego wywołania
printf("%zu",sizeof(c));
zmienna cma 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.5to nie jest pływak, todouble