Inkrementoperator funktioniert nicht mit sizeof [duplicate]

8

Ich frage mich nur, warum der Inkrement-Operator im folgenden Code-Snippet nicht funktioniert:

%Vor%

Ausgabe -

a: 10

b: 4

    
user1367292 27.12.2012, 16:28
quelle

5 Antworten

10

sizeof wertet sein Argument nicht aus. Es berechnet die Größe des Arguments zur Kompilierzeit statisch, ohne dass Code ausgeführt wird.

    
sepp2k 27.12.2012, 16:29
quelle
8

Wenn der Typ des Ausdrucks in sizeof kein variabel modifizierter Array-Typ ist, wird der Ausdruck nicht ausgewertet, da der Typ zur Kompilierzeit vollständig bekannt ist. int hat keine variabel modifizierten Teile.

In C ++ (bis mindestens C ++ 11) gibt es keine variabel modifizierten Typen (zumindest nicht wie im Konzept von C - man kann argumentieren, dass new int[a++] einen variabel modifizierten Array-Typ verwendet, aber der Typ tut das nicht zu irgendeinem anderen Teil der Sprache entkommen.Insbesondere nicht zu sizeof ), so dass in C ++ der Ausdruck zu sizeof niemals ausgewertet wird. In C ist nicht spezifiziert, ob ein Ausdruck ausgewertet wird, wenn er die Größe eines variabel modifizierten Array-Typs nicht beeinflusst. Zum Beispiel

%Vor%

In C (ab C99) gibt dies möglicherweise 11 für a aus, aber es kann auch 10 ausgeben, je nachdem, ob der Compiler schlau genug ist, die Auswertung von a++ wegzulassen und die Größe von int[10] wird zur Kompilierzeit berechnet.

Fußnote: Variabel modifizierte Array-Typen werden auch VLA-Typen (Variable Length Array) genannt. Kurz gesagt, ein variabel modifizierter Typ ist ein Typ, der entweder ein VLA-Typ oder ein Typ ist, der von einem abhängt. Zum Beispiel int(*)[a++] .

    
Johannes Schaub - litb 27.12.2012 16:31
quelle
2

Der Operand des Operators sizeof wird nicht verwendet, er wird nicht ausgewertet. Dies ist Standardverhalten.

    
user529758 27.12.2012 16:29
quelle
1

sizeof ist keine Funktion in C.

Sein Argument wird nicht wirklich ausgewertet, nur sein Typ ist und dies wird zur Kompilierzeit gemacht. In Ihrem Code entspricht die Zuweisung (in Ihrer Architektur):

%Vor%     
lbonn 27.12.2012 16:30
quelle
0

In einem unevaluated-context ist nur der Typ von Bedeutung. Das Gleiche passiert beim Aufruf von Funktionen:

%Vor%     
0x499602D2 27.12.2012 16:36
quelle

Tags und Links