为什么像 ++(++(*++b)) 这样的东西是非法的?

Why is somthing like ++(++(*++b)) illegal?

#include <stdio.h>

int main()
{
    int a[3] = {1, 2, 3};
    int *b = a;
    int c = ++(++(*++b)); /* error: lvalue required as increment operand */
    printf("%d", c);

    return 0;
}

但以下是合法的:

int c = *++b+1+1;

为什么会存在这样的差异?

以下int c = *++b+1+1;是合法的,因为

  • 有 3 个运算符,即 *+++ 并检查 man 1 operator *++ 具有相同的优先级,因此检查结合性 R-->L
  • 所以第一个 *++b 已解决,这是有效的并且它给出了值 2
  • 现在看起来像 int c = 2+1+1 这也是有效的 C 语句

int c = ++(++(*++b)); 是非法的,因为第一个 *++b 被执行,它给出一个值让我们说 2(res) 现在你正在做 ++res 这导致一个整数值 3 直到这没问题,接下来当你做 ++3 这是无效的,因为 ++ 适用于变量而不是常量。所以它给出 lvalue 错误。