左值与右值
-
左值:占据内存中某个地址的对象
-
右值:没有占据内存中某个地址的对象,即:只存在于计算过程中的某个临时寄存器中
-
左值能够进行赋值操作,而右值不能,因为右值没有与之对应的内存存储数据
-
例如:
int foo(){return 2;}//#func1 int& foo(){int* a=new int;return *a;}//#func2 int main(){ foo()=2; }
当调用的函数是#func1时,由于#func1返回的值是一个临时值,不会占据内存某个地址,因此是一个右值,所以无法进行赋值操作,编译器会报错。而#func2则相反
前加与后加
-
前加:变量先进行加1运算,再返回加1运算后的左值
-
后加:将变量取一个副本,自己调用前加进行加1运算,并将副本作为右值返回,即:后加返回的是未进行加1运算的左值
-
例如:
++i=3;//正确 i++=3;//错误,不能对右值进行赋值操作