为何C++中int变量自增部分场景触发lvalue error?
为什么C++中自增操作有的触发lvalue error有的正常?
先看你给出的代码示例:
int main() { int a =1; cout<<++++a; //Prints 3 cout<<a++++; //Gives lvalue error cout<<++a++; //Gives lvalue error }
这个问题的核心,其实就是**前置自增(++a)和后置自增(a++)**的返回值性质不一样,咱们拆开说:
前置自增(
++a):它的执行逻辑是先把变量a的值加1,然后返回的是变量a本身(也就是左值,lvalue)。左值是有内存地址、可以被修改的对象,所以当你写++++a时,第一个++返回的是a这个左值,第二个++可以直接对这个左值再做自增,完全合法。最终a被连续加了两次,从1变成3,所以输出3。后置自增(
a++):它的逻辑是先保存a当前的数值,再把a加1,最后返回的是刚才保存的那个临时数值(也就是右值,rvalue)。右值只是一个临时的数值,没有对应的可修改内存地址,C++不允许对右值做自增这种需要修改操作数的行为。
再看报错的两行:
a++++:第一个a++返回的是右值,紧接着的第二个++试图对这个右值做自增,相当于要修改一个临时值,这违反了C++的规则,所以触发lvalue error。++a++:C++里后置自增的优先级比前置自增高,所以会先执行a++,返回右值,然后对这个右值做前置++,同样是试图修改右值,自然也会报错。
简单说:前置自增返回可修改的左值,支持链式操作;后置自增返回不可修改的右值,没法被后续自增操作处理,这就是差异的根源。
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

