Rozważmy następujący kod:
int main() {
int i = 2;
int b = ++i++;
return 3;
}
Kompiluje się z następującymi błędami:
<source>: In function 'int main()':
<source>:3:16: error: lvalue required as increment operand
3 | int b = ++i++;
| ^~
Brzmi dla mnie uczciwie. Przyrost Postfiksa ma wyższy priorytet niż Przyrost Prefiksu , więc kod jest analizowany jako int b = ++(i++);
i i
jest wartością rvalue. Stąd błąd.
Rozważmy teraz ten wariant z nawiasami, aby zastąpić domyślne priorytety:
int main() {
int i = 2;
int b = (++i)++;
return 3;
}
Ten kod kompiluje się i zwraca 3. Samo w sobie brzmi to uczciwie, ale wydaje się być sprzeczne z pierwszym kodem.
Powstaje pytanie: dlaczego (++i)
to lvalue
, kiedy i
nie jest?
Dzięki!
AKTUALIZACJA: powyższy komunikat o błędzie pochodzi z gcc (x86-64 9.2). Oto dokładne renderowanie: błąd z gcc
Clang x86-64 9.0.0 ma zupełnie inny komunikat: błąd z clang
<source>:3:13: error: expression is not assignable
int b = ++i++;
^ ~~~
Dzięki GCC masz wrażenie, że problem dotyczy operatora Postfiksa, a następnie możesz wędrować, dlaczego ++i
jest OK, a i
nie jest, stąd moje pytanie. W przypadku Clanga jest wyraźniejsze, że problem dotyczy operatora prefiksu.