sizeof
opere con tipi e espressioni. Quando lo si applica a un tipo, lo ()
fa parte della sintassi sizeof
: sizeof(type)
. Quando lo si applica a un'espressione ()
non fanno parte della sintassi sizeof
: sizeof expression
.
Quindi il tuo secondo sizeof
non è realmente "applicato a una variabile". Si applica a un'espressione (f)
. Tale espressione consiste in una singola variabile f
racchiusa in una coppia ridondante di ()
. Puoi anche fare a meno di quella coppia ridondante di ()
e usare solo sizeof f
.
Quando sizeof
viene applicato a un'espressione, restituisce la dimensione del risultato dell'espressione (ovvero la dimensione del tipo di espressione). Nel tuo esempio, entrambe le applicazioni di sizeof
sono valutate allo stesso valore.
In effetti, una buona pratica di programmazione è quella di evitare il più possibile sizeof(type)
, cioè preferisce usare sizeof expression
. Questo rende il tuo codice più indipendente dal tipo, che è sempre una buona cosa. I nomi dei tipi appartengono alle dichiarazioni e da nessun'altra parte.
Hai provato a cercare su Google "sizeof applicato a variabile"? I primi due risultati (uno dei quali è di StackOverflow) sarebbero stati in grado di rispondere alla tua domanda. –
Sì, entrambe le espressioni 'sizeof' restituiscono lo stesso valore. Si noti che il secondo non richiede parentesi; 'sizeof' è un operatore, non una funzione. Ma '% u' richiede un argomento di tipo' unsigned int', non 'size_t'. Scrivi questo: 'printf ("% zu% zu \ n ", sizeof (struct foo), sizeof f);' oppure this: 'printf ("% lu% lu \ n ", (unsigned long) sizeof (struct foo) , (unsigned long) sizeof f); '. '% zu' è una funzionalità specifica per C99; il 'printf' mignt del tuo sistema non lo supporta. –