Perché lo sizeof
è considerato un operatore e non una funzione?Perché la sizeof è considerata un operatore?
Quale proprietà è necessaria per qualificarsi come operatore?
Perché lo sizeof
è considerato un operatore e non una funzione?Perché la sizeof è considerata un operatore?
Quale proprietà è necessaria per qualificarsi come operatore?
Perché lo standard C lo dice e ottiene l'unico voto.
Come conseguenze:
sizeof (int)
, invece di un'espressione oggetto.int a; printf("%d\n", sizeof a);
è perfettamente a posto. Spesso vengono visti, in primo luogo perché sono necessari come parte di un'espressione di tipo cast e in secondo luogo perché sizeof ha una precedenza molto alta, quindi sizeof a + b
non è lo stesso di sizeof (a+b)
. Ma non fanno parte dell'invocazione di sizeof, fanno 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.
Perché non è una funzione. Si può usare così:
int a;
printf("%d\n", sizeof a);
funzione ha punto di ingresso, codice, ecc funzione è quella di essere eseguito in fase di esecuzione (o inline), sizeof deve essere determinato al momento della compilazione.
Può essere utilizzato come costante di compilazione, che è possibile solo se si tratta di un operatore piuttosto che di una funzione. Per esempio:
union foo {
int i;
char c[sizeof(int)];
};
Sintatticamente se non fosse un operatore, allora dovrebbe essere una macro preprocessore poiché funzioni non possono prendere tipi come argomenti. Questa sarebbe una macro difficile da implementare dal momento che sizeof
può prendere come argomento sia i tipi che le variabili.
+1 ma si noti che non è una costante in fase di compilazione quando l'argomento è una matrice di lunghezza variabile VLA. –
Perché:
sizeof
non avrebbe alcun modo di determinare la dimensioneC'è una piccola differenza rispetto alla funzione - il valore di sizeof viene risolto in fase di compilazione, ma non in fase di esecuzione!
Tranne VLA - array di lunghezza variabile - argomenti. –
Perché lo standard C lo dice e ottiene l'unico voto.
e lo standard è probabilmente corretto perché sizeof
prende un tipo e
In generale, se sia il dominio o codominio (o entrambi) di una funzione contiene elementi molto più complessi di numeri reali, che la funzione è indicata come un operatore. Viceversa, se né il dominio né il codominio di una funzione contengono elementi più complicati dei numeri reali, è probabile che tale funzione venga semplicemente definita come una funzione. Funzioni trigonometriche come il coseno sono esempi di quest'ultimo caso.
Inoltre, quando le funzioni vengono utilizzate così frequentemente da essersi evolute notazioni più veloci o più semplici rispetto alla forma generica F (x, y, z, ...), i moduli speciali risultanti vengono anche chiamati operatori. Gli esempi includono operatori infissi come addizione "+" e divisione "/" e operatori postfix come fattoriale "!". Questo utilizzo non è correlato alla complessità delle entità coinvolte.
Questo probabilmente spiega la motivazione dello standard C (e di altri linguaggi di programmazione) nell'usare i termini "operatore" e "funzione" come fanno. –
Poiché si tratta di un operatore fase di compilazione che, al fine di calcolare la dimensione di un oggetto, è necessario immettere informazioni che è disponibile solo al momento della compilazione. Questo non vale per C++.
operatore sizeof è compilare entità tempo non runtime e non hanno bisogno parentesi come una funzione. Quando il codice viene compilato, sostituisce il valore con la dimensione di tale variabile al momento della compilazione, ma in funzione dopo che la funzione viene eseguita, si conoscerà il valore restituito.
sizeof()
operatore è una fase di compilazione sarebbe occorrenza. Può essere usato per determinare i parametri o gli argomenti.
Perché il downvote? –
Wow, proprio quello che stavo pensando! – crashmstr
Non posso dirlo meglio. –
spiegazione impressionante! –