Ich frage mich nur, warum der Inkrement-Operator im folgenden Code-Snippet nicht funktioniert:
%Vor%Ausgabe -
a: 10
b: 4
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
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++]
.
Der Operand des Operators sizeof
wird nicht verwendet, er wird nicht ausgewertet. Dies ist Standardverhalten.
In einem unevaluated-context ist nur der Typ von Bedeutung. Das Gleiche passiert beim Aufruf von Funktionen:
%Vor%