C++preIncrement和postIncrement的奇妙体验

Weird experience with C++ preIncrement and postIncrement

本文关键字:体验 postIncrement C++preIncrement      更新时间:2023-10-16

++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"变量。

如果++aLvalue,但a++的结果是Rvalue值分配任何内容,因此会出现错误。

不同之处在于(简化一点)Lvalue是指某个对象的表达式,而Rvalue指存储在内存某处的数据

假设a++的结果是7。基本上,当您编写a++ = b;时,您试图将b分配给7,这显然是不可能的。另一方面,当您写入++a = b;时,增量的结果是引用aLvalue,因此赋值将有效。

您可以在此处阅读更多关于LvaluesRvalues的信息。

++a是一个l值(递增a并"返回"新值),a++是一个r值[递增a并用a的旧值"返回"临时值]。

正如您所说,这不是一个有意义的代码,但我想说++a递增a并产生递增变量的值,而a++产生变量的左值,然后递增a(然后被赋值覆盖)。你不能给a赋值,你需要一个左值(基本上是一个分配了相关内存的值)。