为什么增量操作 ++a++ 不起作用,至少在 C 中是这样?

Why does increment operation ++a++ not work, at least in C?

我很好奇,发现当前这段代码不起作用,但我不明白为什么:

#include <stdio.h>

void main(){
        int a = 42;
        printf("%d\n", ++a++);
}

对我来说这似乎不是错误的语法。有人可以解释错误输出吗?

first.c: In function ‘main’:
first.c:5:17: error: lvalue required as increment operand
  printf("%d\n", ++a++);

Could somebody explain the error output?

说明C不支持这样的操作

++a++ 等于 ++(a++)(因为 operator precedence), and the value returned by a++ is a non-lvalue object expression(也称为 rvalues)。

这些值(本质上)是短暂的,不能被前缀 ++ 运算符修改。

在 C 中,++x 是一个值,不是左值。它的作用是递增 x,并评估新分配的值 x。由于 ++x 不是左值,因此无法递增。

在 C++ 中,++x 是左值,而不是右值。它的作用是递增 x,并将 x 计算为左值。由于 ++x 又是一个左值,它可以再次递增。

++x 在 C++ 中作为左值有意义的原因是因为 C++ 引入了引用类型。鉴于

void f(int &);
int i;

调用 f(++i) 可能有意义,它在递增后通过引用传递 i。

因为 C 没有引用类型,所以 ++i 是左值没有什么意义。从历史上看,它从来没有,而且与 C++ 不同,C 从未获得令人信服的理由来更改规则。

请注意,与将 ++x 设为左值相比,C++ 需要进行更广泛的更改才能真正让它发挥作用。使 ++x 成为左值,而没有其他任何东西,将导致 ++x 未定义行为,因为在对 x 的修改和随后的左值到值转换之间不会有序列点。 ++++x 更明显。 C++ 必须修改排序规则才能使其工作。在 C 中,对排序规则的修改可能会导致现有编译器无法遵守新规则,因此除非有很大的好处,否则此类修改很可能会被拒绝。