2009-09-08 22 views

risposta

152

Perché lo standard C lo dice e ottiene l'unico voto.

Come conseguenze:

  • L'operando di sizeof può essere un tipo parentesi tonde, sizeof (int), invece di un'espressione oggetto.
  • Le parentesi non sono necessarie: 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.
  • Non è possibile prendere l'indirizzo di sizeof.
  • L'espressione che è l'operando di sizeof non viene valutata in fase di esecuzione (sizeof a++ non modifica a).
  • L'espressione che è l'operando di sizeof può avere qualsiasi tipo tranne void o tipi di funzione. In effetti, questo è il punto della dimensione di.

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.

+2

Wow, proprio quello che stavo pensando! – crashmstr

+6

Non posso dirlo meglio. –

+0

spiegazione impressionante! –

3

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.

20

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.

+2

+1 ma si noti che non è una costante in fase di compilazione quando l'argomento è una matrice di lunghezza variabile VLA. –

1

Perché:

  • quando si passa un valore a una funzione, la dimensione dell'oggetto non è passato alla funzione, in modo da una "funzione" sizeof non avrebbe alcun modo di determinare la dimensione
  • in C, le funzioni possono accettare solo un tipo di argomento; sizeof() deve accettare tutti i tipi di cose differnet (variabili e tipi! Non è possibile passare un tipo a una funzione in C)
  • chiamare una funzione implica eseguire una copia degli argomenti e altro overhead non necessario
0

C'è una piccola differenza rispetto alla funzione - il valore di sizeof viene risolto in fase di compilazione, ma non in fase di esecuzione!

+5

Tranne VLA - array di lunghezza variabile - argomenti. –

5

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.

(Wikipedia)

+0

Questo probabilmente spiega la motivazione dello standard C (e di altri linguaggi di programmazione) nell'usare i termini "operatore" e "funzione" come fanno. –

0

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++.

1

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.

0

sizeof() operatore è una fase di compilazione sarebbe occorrenza. Può essere usato per determinare i parametri o gli argomenti.

+0

Perché il downvote? –

Problemi correlati