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.
Antworten:
i
und++i
sind beide lWerte, aber esi++
ist ein rWert.++(i++)
kann nicht gültig sein, da das Präfix++
angewendet wirdi++
, was ein r-Wert ist. Ist aber(++i)++
in Ordnung, weil++i
es ein Wert ist.Beachten Sie, dass in C die Situation anders ist.
i++
und++i
sind beide rWerte. (Dies ist ein Beispiel dafür, warum Menschen aufhören sollten anzunehmen, dass C und C ++ dieselben Regeln haben. Menschen nehmen diese Annahmen in ihre Fragen auf, die dann widerlegt werden müssen.)quelle
Diese Erklärung
ist äquivalent zu
Der Postfix-Inkrement-Operator gibt den Wert des Operanden vor dem Inkrement zurück.
Aus dem C ++ 17-Standard (8.2.6 Inkrementieren und Dekrementieren)
Während der unäre Inkrementoperator nach seinem Inkrement den Wert l zurückgibt. Also diese Erklärung
ist gültig. Sie könnten zum Beispiel schreiben
Aus dem C ++ 17 Standard (8.3.2 Inkrementieren und Dekrementieren)
Beachten Sie, dass in C beide Operatoren einen Wert anstelle von lvalue zurückgeben. Also in C diese Erklärung
ist ungültig.
quelle
Nein
i
ist kein Wert.i
ist ein Wert.i++
ist ein r-Wert (genauer gesagt ein Wert).quelle