在C++中,可以将前递增(或前递减)用作l值,但不能将后递增(或后递减)用作l值。
例如,以下程序打印a = 20 (++ a用作l值)
// CPP program to illustrate
// Pre-increment (or pre-decrement)
#include
int main()
{
int a = 10;
++a = 20; // works
printf("a = %d", a);
getchar();
return 0;
}
a = 20
上面的程序有效,而下面的程序编译失败,错误为“赋值中的非左值” (a ++用作左值)
// CPP program to illustrate
// Post-increment (or post-decrement)
#include
int main()
{
int a = 10;
a++ = 20; // error
printf("a = %d", a);
getchar();
return 0;
}
prog.cpp: In function 'int main()':
prog.cpp:6:5: error: lvalue required as left operand of assignment
a++ = 20; // error
^
++ a与a ++作为左值有何不同?
这是因为++a
返回一个lvalue ,它基本上是对我们可以进一步分配给该变量的引用-就像普通变量一样。也可以将其分配给参考,如下所示:
int &ref = ++a; // valid
int &ref = a++; // invalid
而如果您回想起a++
工作原理,它并不会立即增加其持有的价值。为简便起见,您可以将其视为在下一条语句中递增。因此,基本上发生的是a++
返回一个rvalue ,它基本上只是一个值,类似于未存储的表达式的值。您可以想到a++ = 20;
处理后如下:
int a = 10;
// On compilation, a++ is replaced by the value of a which is an rvalue:
10 = 20; // Invalid
// Value of a is incremented
a = a + 1;
这应该有助于理解为什么a++ = 20;
将无法正常工作。
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。