这涉及C和C ++中的左值和右值。
在C编程语言中,前递增和后递增运算符均返回rvalue,而不是lvalue。这意味着它们不能在=
赋值运算符的左侧。这两个语句都将在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 ++中,预增量运算符返回一个 lvalue,而后增量运算符返回一个rvalue。这意味着可以将带有预增量运算符的表达式放在=
赋值运算符的左侧!
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++.