3

++a = b操作显示没有错误,但a++ = b在编译时显示错误g++。这两个变量都在这些操作之前初始化。

尽管这些操作没有实际用途,但我认为它们都应该在编译时发出相同的错误。你怎么看?如果有正当理由,请向我解释。提前致谢!:)

PSgcc在这两个上都给出了错误。

4

4 回答 4

8

让我们看看 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”变量。

于 2012-09-11T08:39:26.457 回答
6

结果 if++aLvalue,但结果a++Rvalue,您不能将任何内容分配给Rvalue,因此会出现错误。

不同之处在于(简化一点)左值是引用某个对象的表达式,而右值是指存储在内存中某处的数据。

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

您可以在此处阅读有关左值 值的更多信息。

于 2012-09-11T08:31:30.233 回答
3

++a是一个左值(递增a并“返回”新值),a++是一个右值(递增a并“返回”一个具有旧值的临时值a)。

于 2012-09-11T08:31:53.833 回答
1

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

于 2012-09-11T08:31:42.163 回答