为什么a++不能返回左值但++a可以呢?
问题描述:
比如说:
int a=0;
++a +=2;是可以的
a++ +=2;却不可以;
所以怎么理解a++返回的不是左值?
这应该是运算过程的差异吧?
答
++i 先将 i 所存放的数加一,再返回i,即&(++i)是有意义的,可以作为一个左值,
而 i++ 将 i的值加一,并且返回没有增加前的i,(i++先保存i原来的 值 ,再将i的值加一, 然后返回未加一之前的 值)这个时候这个(i++)是一个数字,没有固定的存放地址,所以只能作为右值了.
答
你要看什么编译器,在gcc上++a +=2;也不能编译
错误提示
error: expression is not assignable
++a +=2;
~~~ ^
再说, 编译器不认识你的空格
a++ +=2;
编译器看到的未必是a++ += 2
也许是a + ++ = 2
或者别的,这个和编译器有关。
答
其实主要看你编译器。在C和C++中,有很多未定义的标准就是看编译器是怎么执行
如果你理解运算符重载的话,你会知道在调用++n的时候会把n引用进去最后返回加一后的n
用上面来说: ++n ==》 int&a=n; a=+1; a+=2 return n;
对于n++ +=n 虽然n被引用进去,但是最后不可能返回n的引用,通常做法就是新建一个变量等于n然后加一 最后返回
简单说: n++ ==》 int &a=n; int b=a; a=a+1; return b;
因为b是局部变量,函数结束后就会销毁,只会返回一个常数 所以 2+=2这样是不可能的;
n++ +=2可以成立,但是最终不是加在n上面,没有利用价值,编译器也就不会这样子做