Почему "a +++++ b" не может быть скомпилирован в gcc, но могут быть "a +++ b", "a ++ + ++ b" и "a +++ ++ b"?
Возможный дубликат:
Пожалуйста, помогите мне понять ошибку a +++++ b в C
Вот пример кода, почему "a +++++ b" не может быть скомпилирован, но другие могут быть?
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int a = 0;
int b = 0;
int c = 0;
c = a+++b;
printf("a+++b is: %d\n", c);
c = a = b = 0;
c = a++ + ++b;
printf("a++ + ++b is: %d\n", c);
c = b = a = 0;
c = a+++ ++b;
printf("a+++ ++b is: %d\n", c);
c = b = a = 0;
c = a+++++b; // NOTE: Can not be compiled here.
printf("a+++++b is: %d\n", c);
return 0;
}
Ответы
Ответ 1
Это потому, что a+++++b
анализируется как a ++ ++ + b
, а не как a ++ + ++ b
[C токенизатор жадный]. a++
возвращает rvalue, и вы не можете применить ++
к r-значению, чтобы получить эту ошибку.
a+++b; // parsed as a ++ + b
a+++ ++b; // parsed as a ++ + ++ b
Прочитайте о правиле Maxunch Munch.
Ответ 2
Компилятор жадный, поэтому ваше выражение
a+++++b
будет пониматься как
a++ ++ +b
Ответ 3
Каскад +
cascade... с a+++++b
, после добавления операций добавления не существует l-value (адресное значение памяти), после чего операции каскадирования выполняются.
Другими словами, a+++b
совпадает с (a++) + b
. Это действительная операция. То же самое верно при a+++ ++b
, который равен (a++) + (++b)
. Но с a+++++b
вы не получите этого через C-парсер. Для анализатора это выглядит как ((a++)++) + b
, и поскольку (a ++) возвращает temp, это не значение l, которое может быть увеличено снова с помощью оператора ++
.
Ответ 4
# include <stdio.h>
# include <stdlib.h>
int main(int argc, char **argv)
{
int a = 0;
int b = 0;
int c = 0;
c = a+++b;
printf("a+++b is: %d\n", c);
c = a = b = 0;
c = (a++)+(++b);
printf("a++ + ++b is: %d\n", c);
c = b = a = 0;
c = (a++)+(++b);
printf("a+++ ++b is: %d\n", c);
c = b = a = 0;
c = (a++)+(++b);
printf("a+++++b is: %d\n", c);
return 0;
}