为什么递增操作++ a ++不起作用,至少在C中?

Lon*_*yen -4 c increment pre-increment post-increment

我很好奇,发现当前的一段代码不起作用,但我无法弄清楚原因:

#include <stdio.h>

void main(){
        int a = 42;
        printf("%d\n", ++a++);
}
Run Code Online (Sandbox Code Playgroud)

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

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

Som*_*ude 10

++a++等于++(a++)(因为操作者的优先级),并且通过返回的值a++是一个非左值对象表达式(也称为右值).

这些值(实质上)是短暂的,不能由前缀++运算符修改.


Bad*_*ran 5

在 C 中,++x是一个值,而不是左值。其作用是增加x,并计算为新分配的值x。由于++x不是左值,因此无法递增。

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

++x在 C++ 中成为左值是有意义的,因为 C++ 引入了引用类型。给定

void f(int &);
int i;
Run Code Online (Sandbox Code Playgroud)

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

由于 C 没有引用类型,因此 ++i 作为左值没有什么意义。从历史上看,从来没有这样过,而且与 C++ 不同,C 从未获得过改变规则的令人信服的理由。

请注意,C++ 需要比创建左值更广泛的更改++x才能真正发挥作用。如果没有任何其他内容,创建++x左值会使 ++x 出现未定义的行为,因为对 x 的修改和随后的左值到值的转换之间不会存在序列点。更明显的是,对于++++x. C++ 必须修改排序规则才能使其工作。在 C 语言中,对排序规则的修改可能会导致现有编译器在遵守新规则时出现问题,因此此类修改可能会被拒绝,除非有很大的好处。