Dabei bin ich auf folgenden Codeschnipsel gestoßen:
int a = 3;
printf("%d", sizeof(a)++);
Anscheinend wird dies mit GCC 9.3.0 und -std=c99 kompiliert. Dies wird zwar nicht kompiliert:
printf("%d", sizeof(3)++);
GCC gibt einen Fehler aus
Fehler: lvalue als Inkrement-Operand erforderlich
Bevor ich das erste Snippet kompiliert habe, hätte ich einen solchen Fehler erwartet.
Der Operand des Postfix ++-Operators muss ein L-Wert gemäß C99-Standard sein
Der Operand des Postfix-Inkrement- oder -Dekrement-Operators muss einen qualifizierten oder nicht qualifizierten Real- oder Zeigertyp haben und ein modifizierbarer L-Wert sein.
Über den Rückgabewert des sizeof-Operators (wie erwartet):
Der sizeof-Operator liefert die Größe (in Byte) seines Operanden, der ein Ausdruck oder der eingeklammerte Name eines Typs sein kann. Die Größe wird durch den Typ des Operanden bestimmt. Das Ergebnis ist eine ganze Zahl. Wenn der Typ des Operanden ein Array-Typ mit variabler Länge ist, wird der Operand ausgewertet; Andernfalls wird der Operand nicht ausgewertet und das Ergebnis ist eine ganzzahlige Konstante.
Der Wert des Ergebnisses ist implementierungsdefiniert, und sein Typ (ein vorzeichenloser ganzzahliger Typ) ist size_t, definiert in (und anderen Headern).
Wie ist es möglich, die sizeof(a)++
kompiliert? Ist das undefiniertes Verhalten oder übersehe ich etwas?
Vielleicht verwirren dich die Klammern. Du kannst es auch so schreiben:
sizeof a++
.– Fiddle Bits
7. Mai 2020 um 17:18 Uhr
Es ist dasselbe wie
sizeof (a++)
.sizeof
ist ein Operator und keine Funktion. Und es hat eine niedrigere Priorität als++
– Eugen Sch.
7. Mai 2020 um 17:20 Uhr
Im Wesentlichen das gleiche wie stackoverflow.com/questions/46653406/…
– Typ Inkognito
7. Mai 2020 um 17:28 Uhr