这涉及 C 和 C++ 中的左值和右值。
在 C 编程语言中,前自增和后自增运算符都返回右值,而不是左值。这意味着它们不能位于=
赋值运算符的左侧。这两个语句都会在 C 中给出编译器错误:
int a = 5;
a++ = 2; /* error: lvalue required as left operand of assignment */
++a = 2; /* error: lvalue required as left operand of assignment */
然而,在 C++ 中,前增量运算符返回一个左值,而后增量运算符返回一个右值。=
这意味着带有前置自增运算符的表达式可以放在赋值运算符的左侧!
int a = 5;
a++ = 2; // error: lvalue required as left operand of assignment
++a = 2; // No error: a gets assigned to 2!
为什么会这样?后增量使变量递增,并返回发生增量之前的变量。这实际上只是一个右值。变量 a 的前一个值作为临时值复制到寄存器中,然后将 a 递增。但是 a 的前一个值是由表达式返回的,它是一个右值。它不再代表变量的当前内容。
预增量首先增加变量,然后返回发生增量后的变量。在这种情况下,我们不需要将变量的旧值存储到临时寄存器中。我们只是在变量增加后检索变量的新值。所以预增量返回一个左值,它返回变量 a 本身。我们可以使用将此左值分配给其他东西,就像下面的语句。这是从左值到右值的隐式转换。
int x = a;
int x = ++a;
由于预增量返回一个左值,我们也可以给它赋值。以下两个陈述是相同的。在第二个赋值中,首先 a 增加,然后它的新值被 2 覆盖。
int a;
a = 2;
++a = 2; // Valid in C++.