sizeof
współpracuje z typów i wyrażeń. Po zastosowaniu go do typu, ()
są częścią składową sizeof
: sizeof(type)
. Po zastosowaniu go do wyrażenia ()
nie należy do składni sizeof
: sizeof expression
.
Twoja druga sizeof
nie jest "zastosowana do zmiennej". Stosuje się do wyrażenia (f)
. To wyrażenie składa się z pojedynczej zmiennej f
zamkniętej w zbędnej parze ()
. Można również obejść się bez tej zbędnej pary ()
i używać tylko sizeof f
.
Po zastosowaniu do wyrażenia sizeof
zwraca rozmiar wyniku wyrażenia (tj. Rozmiar typu, który ma wyrażenie). W twoim przykładzie obie aplikacje o numerze sizeof
mają zagwarantowaną wartość równą tej wartości.
W rzeczywistości, dobrą praktyką programowania jest unikanie w możliwie największym stopniu sizeof(type)
, tj. Wolą używać sizeof expression
. To sprawia, że twój kod jest bardziej niezależny od typu, co zawsze jest dobre. Nazwy typów należą do deklaracji i nigdzie indziej.
Czy próbowałeś Googling "sizeof applied to variable"? Pierwsze dwa wyniki (z których jeden pochodzi ze StackOverflow) byłyby w stanie odpowiedzieć na twoje pytanie. –
Tak, oba wyrażenia 'sizeof' zwracają tę samą wartość. Zauważ, że drugi nie wymaga nawiasów; 'sizeof' jest operatorem, a nie funkcją. Ale '% u' wymaga argumentu typu' unsigned int', a nie 'size_t'. Napisz: printf ("% zu% zu \ n", sizeof (struct foo), sizeof f); 'lub this:' printf ("% lu% lu \ n", (unsigned long) sizeof (struct foo) , (unsigned long) sizeof f); ". '% zu' to funkcja specyficzna dla C99; systemowy 'printf' mignt nie obsługuje tego. –