#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;
}
Dane wyjściowe to:
8 4 4 4 4 1
Dlaczego dane wyjściowe są różne dla tych samych wartości?
6.5
to nie jest pływak, todouble
printf("%d",sizeof(6.5f));
zrobić tofloat
.printf("%zu", sizeof(6.5));
Odpowiedzi:
Stałe znakowe w C (przeciwne do C ++) mają typ
int
. Więc to połączeniewyjścia 4. To
sizeof( 'A' )
jest równesizeof( int )
.Ze standardu C (6.4.4.4 Stałe znaków)
Z drugiej strony (6.5.3.4 Wielkość i wyrównanie operatorów)
Tak więc operand
sizeof
operatora w tym wyrażeniusizeof( 'A' )
ma typ int, podczas gdy w tym wyrażeniu,sizeof( a )
gdzie a jest zadeklarowane jakoperand ma typ
char
.Zwróć uwagę na takie połączenia
użyj niepoprawnego specyfikatora formatu konwersji. Musisz pisać
Również w powyższym wywołaniu używana jest stała tego typu
double
podczas tego wywołaniazmienna
c
ma typfloat
.Możesz uzyskać taki sam wynik dla tych wywołań, jeśli pierwsze wywołanie użyje stałej typu float jak
źródło
Stałe, podobnie jak zmienne, mają swój własny typ:
6.5
: Stała zmiennoprzecinkowa typudouble
90000
: Stała typu całkowitegoint
(jeśliint
wynosi 32 bity) lublong
(jeśliint
wynosi 16 bitów)'A'
: Stała znakowa typuint
w C ichar
C ++Rozmiary, które są drukowane, są rozmiarami powyższych typów.
Wynik
sizeof
operatora ma również typsize_t
. Tak więc podczas drukowania odpowiedniego specyfikatora formatu do użycia%zu
nie jest%d
.źródło
Ponieważ wartości nie mają znaczenia
sizeof
. To rozmiar typów.stałe znakowe to
int
s,char
a nie s.stałe zmiennoprzecinkowe są domyślnie
double
s, chyba że dodasz je za pomocąf
lubl
.źródło