为什么增量操作 ++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 中,对排序规则的修改可能会导致现有编译器无法遵守新规则,因此除非有很大的好处,否则此类修改很可能会被拒绝。
我很好奇,发现当前这段代码不起作用,但我不明白为什么:
#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 中,对排序规则的修改可能会导致现有编译器无法遵守新规则,因此除非有很大的好处,否则此类修改很可能会被拒绝。