Betrachten wir den folgenden Code:
int main() {
int i = 2;
int b = ++i++;
return 3;
}
Es wird mit folgendem Fehler kompiliert:
<source>: In function 'int main()':
<source>:3:16: error: lvalue required as increment operand
3 | int b = ++i++;
| ^~
Das klingt fair für mich. Das Postfix-Inkrement hat eine höhere Priorität als das Präfix-Inkrement, daher wird der Code als r-Wert analysiert int b = ++(i++);
und i
ist ein r-Wert. Daher der Fehler.
Betrachten wir nun diese Variante in Klammern, um die Standardprioritäten zu überschreiben:
int main() {
int i = 2;
int b = (++i)++;
return 3;
}
Dieser Code kompiliert und gibt 3 zurück. Das klingt für mich fair, scheint aber im Widerspruch zum ersten Code zu stehen.
Die Frage: Warum (++i)
ist ein lvalue
Wann i
nicht?
Vielen Dank!
UPDATE: Die oben gezeigte Fehlermeldung stammt von gcc (x86-64 9.2). Hier ist das genaue Rendering: Fehler mit gcc
Clang x86-64 9.0.0 hat eine ganz andere Meldung: Fehler mit Clang
<source>:3:13: error: expression is not assignable
int b = ++i++;
^ ~~~
Mit GCC haben Sie den Eindruck, dass das Problem beim Postfix-Operator liegt, und Sie können dann herausfinden, warum dies ++i
in Ordnung i
ist, solange dies nicht der Fall ist, daher meine Frage. Bei Clang ist klarer, dass das Problem beim Präfixoperator liegt.