Warum kompiliert sizeof(x)++? [duplicate]

Lesezeit: 2 Minuten

Benutzeravatar von Eddi
Eddi

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

Das sizeof ist ein Operator, keine Funktion, und wie jeder Operator hat er einen Vorrang, der in C niedriger ist als der ++ Operator. Daher das Konstrukt sizeof(a)++ ist äquivalent zu sizeof a++ was wiederum äquivalent ist zu sizeof (a++). Hier haben wir Postinkrement eingeschaltet a Das ist ein lvalue, also ist es vollkommen legal. Wenn statt a Sie haben 3 was nicht lvalue ist, schlägt die Kompilierung fehl.

  • Ich schwöre … Ich habe ein glücklicheres Leben geführt, bevor ich diese Antwort besucht habe!

    – Cort Ammon

    8. Mai 2020 um 2:47 Uhr

1402900cookie-checkWarum kompiliert sizeof(x)++? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy