Почему "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;
}