C++preIncrement和postIncrement的奇妙体验
Weird experience with C++ preIncrement and postIncrement
++a = b
操作没有显示错误,但a++ = b
在使用g++
编译时显示错误。这两个变量都是在执行这些操作之前初始化的。
虽然这些操作没有实际用途,但我认为它们在编译时都应该发出相同的错误。你觉得怎么样?如果有正当理由,请向我解释。提前感谢!:)
第页。S.gcc
在这两方面都给出了误差。
让我们看看前/后增量的声明是什么样子的(http://en.cppreference.com/w/cpp/language/operator_incdec):
++a: T& operator ++(T& a);
a++: T operator ++(T& a, int);
你已经得到了答案-preInc返回引用,所以你可以使用"="运算符覆盖"a"变量。
如果++a
是Lvalue,但a++
的结果是Rvalue值分配任何内容,因此会出现错误。
不同之处在于(简化一点)Lvalue是指某个对象的表达式,而Rvalue指存储在内存某处的数据。
假设a++
的结果是7
。基本上,当您编写a++ = b;
时,您试图将b
分配给7
,这显然是不可能的。另一方面,当您写入++a = b;
时,增量的结果是引用a
的Lvalue,因此赋值将有效。
您可以在此处阅读更多关于Lvalues和Rvalues的信息。
++a
是一个l值(递增a
并"返回"新值),a++
是一个r值[递增a
并用a
的旧值"返回"临时值]。
正如您所说,这不是一个有意义的代码,但我想说++a
递增a并产生递增变量的值,而a++
产生变量的左值,然后递增a(然后被赋值覆盖)。你不能给a赋值,你需要一个左值(基本上是一个分配了相关内存的值)。