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