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