Quando il tipo di espressione sizeof non è un tipo di matrice variabile modificata, l'espressione non viene valutata perché il tipo è completamente noto al momento della compilazione. int
non ha parti modificate in modo variabile.
In C++ (almeno C++ 11) non ci sono tipi variabilmente modificati (almeno non come nel concetto di C - si può sostenere che new int[a++]
utilizza un tipo di matrice variabilmente modificato, ma il tipo non sfuggire a qualsiasi altra parte della lingua, in particolare, non a sizeof
), quindi in C++, l'espressione to sizeof non viene mai valutata. In C, non è specificato se un'espressione viene valutata se non influenza la dimensione di un tipo di matrice modificato in modo variabile. Ad esempio
int main()
{
int a = 10;
int b = sizeof(int[a++ ? 1 : 1]);
cout<<"a: "<<a<<endl;
cout<<"b: "<<b<<endl;
return 0;
}
In C (da C99 in poi), questo può uscita 11
per a
, ma può anche uscita 10
, a seconda che il compilatore è abbastanza intelligente omettere valutare a++
, deducendo che il sizeof int[10]
è calcolato al momento della compilazione.
Nota a piè di pagina: i tipi di array modificati in modo variabile sono anche chiamati tipi VLA (array di lunghezza variabile). In breve, un tipo variabilmente modificato è un tipo che è o un tipo VLA o un tipo che dipende da uno. Ad esempio int(*)[a++]
.
fonte
2012-12-27 16:31:58
Sizeof è un operatore in fase di compilazione e l'intero sizeof() viene sostituito con il suo valore risultante prima della compilazione del codice. Vedere: http: // stackoverflow.it/questions/8225776/why-does-sizeofx-not-increment-x/8225813 # 8225813 –
Qual è il comportamento previsto per quel codice? –
@EtiennedeMartel: Immagino che l'aspettativa del richiedente sia a = 11, b = 10. –