Risposte:
Perché lo standard C lo dice e ottiene l'unico voto.
Come conseguenze:
sizeof (int)
, invece di un'espressione di oggetto.int a; printf("%d\n", sizeof a);
va benissimo. Sono spesso visti, in primo luogo perché sono necessari come parte di un'espressione cast di tipo, e in secondo luogo perché sizeof ha una precedenza molto alta, quindi sizeof a + b
non è la stessa di sizeof (a+b)
. Ma non fanno parte dell'invocazione di sizeof, sono parte dell'operando.sizeof a++
non modifica a).Una funzione sarebbe diversa su tutti questi punti. Ci sono probabilmente altre differenze tra una funzione e un operatore unario, ma penso che sia sufficiente per mostrare perché sizeof non potrebbe essere una funzione anche se ci fosse un motivo per volerlo.
sizeof
di avere effetti collaterali se c'è un VLA nell'espressione.
(int)
non è niente di speciale - solo un nome di un tipo tra parentesi. Le parentesi qui fanno parte della sintassi di sizeof
: sono richieste quando si prende la dimensione di un tipo, ma non sono richieste quando si prende la dimensione di un'espressione. Vedi ad esempio qui
sizeof
: sizeof unary-expression
e sizeof ( type-name )
- quindi nello standard C11 non è considerato un "cast" ma un nome di tipo tra parentesi. Il risultato netto è più o meno lo stesso. (Per confronto, un'espressione cast è ( type-name ) cast-expression
.) E odio il modo in cui il commento Markdown funziona diversamente da Q&A Markdown!
Può essere utilizzato come costante del tempo di compilazione, il che è possibile solo se è un operatore piuttosto che una funzione. Per esempio:
union foo {
int i;
char c[sizeof(int)];
};
Sintatticamente, se non fosse un operatore, dovrebbe essere una macro del preprocessore poiché le funzioni non possono accettare tipi come argomenti. Sarebbe una macro difficile da implementare poiché sizeof
può prendere come argomento sia i tipi che le variabili.
Perché lo standard C lo dice e ottiene l'unico voto.
E lo standard è probabilmente corretto perché sizeof
accetta un tipo e
In generale, se il dominio o il codominio (o entrambi) di una funzione contiene elementi significativamente più complessi dei numeri reali, quella funzione viene chiamata operatore. Al contrario, se né il dominio né il codominio di una funzione contengono elementi più complicati dei numeri reali, è probabile che quella funzione venga chiamata semplicemente una funzione. Le funzioni trigonometriche come il coseno sono esempi di quest'ultimo caso.
Inoltre, quando le funzioni vengono utilizzate così spesso che si sono evolute in notazioni più veloci o più facili rispetto alla forma generica F (x, y, z, ...), le forme speciali risultanti sono anche chiamate operatori. Gli esempi includono operatori infisso come addizione "+" e divisione "/" e operatori suffisso come fattoriale "!". Questo utilizzo non è correlato alla complessità delle entità coinvolte.
Perché non è una funzione. Puoi usarlo in questo modo:
int a;
printf("%d\n", sizeof a);
La funzione ha un punto di ingresso, codice, ecc. La funzione deve essere eseguita in fase di esecuzione (o inline), la dimensione di deve essere determinata in fase di compilazione.
L'operatore sizeof è un'entità in fase di compilazione non runtime e non necessita di parentesi come una funzione. Quando il codice viene compilato, sostituisce il valore con la dimensione di quella variabile in fase di compilazione, ma in funzione dopo che la funzione viene eseguita, conosceremo il valore restituito.
Perché:
sizeof
"funzione" non avrebbe modo di determinare la dimensioneC'è una piccola differenza dalla funzione: il valore di sizeof viene risolto in fase di compilazione, ma non in fase di runtime!
Perché è un operatore in fase di compilazione che, per calcolare la dimensione di un oggetto, richiede informazioni sul tipo che sono disponibili solo in fase di compilazione. Questo non vale per C ++.
Sizeof (), penso che ovviamente sia sia una funzione che un operatore. Perché? Perché una funzione contiene le parentesi per l'ingresso nella fase di ingresso. Ma principalmente anche un operatore causa operatori sono caratteri di azione, quindi sizeof è un'istruzione di azione che agisce sull'operando tra parentesi.