C++ 使用C++;增前增后

C++ 使用C++;增前增后,c++,gcc,g++,C++,Gcc,G++,++a=b操作未显示错误,但a++=b在使用g++编译时显示错误。这两个变量都是在这些操作之前初始化的 虽然这些操作没有实际用途,但我认为它们在编译时应该发出相同的错误。你怎么认为?如果有正当理由,请向我解释。提前感谢!:) p.S.gcc在这两个方面都给出了错误。如果++a的结果是左值,但a++的结果是右值,则不能为右值分配任何内容,因此出现错误 不同之处在于(简化一点)左值是一个引用某个对象的表达式,而右值是指存储在内存中某处的数据 假设a++的结果是7。基本上,当你写a++=b您试图将b分

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

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


p.S.
gcc
在这两个方面都给出了错误。

如果
++a
的结果是左值,但
a++
的结果是右值,则不能为右值分配任何内容,因此出现错误

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

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


您可以阅读更多关于左值和右值的内容。

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

++a
是一个l值(递增
a
并“返回”新值),
a++
是一个r值(递增
a
并“返回”)旧值为
a
)的临时值

让我们看看递增前/递增后的声明是怎样的():


您得到了答案-preInc返回引用,因此您可以使用“=”运算符覆盖“a”变量。

为什么您认为这些表达式会给出相同的错误?它们很不一样。嗯,比那复杂一点。类类型的R值也引用对象。Xvalue也是一个右值,总是引用某个对象。只有标量类型的PRvalues才是值,不引用任何对象。@sellibitze,是的,大多数对象也可以同时用作左值和右值,因为左值可以隐式转换为右值,反之亦然。不过我没有说太多细节,因为它们与问题没有直接关系,所以我放了一个链接,以防OP想进一步阅读。“增量的结果是一个临时值,它包含7”--不,增量的结果是一个左值表达式,它引用对象
a
(其值比增量之前大1)。没有临时值。
++a: T& operator ++(T& a);
a++: T operator ++(T& a, int);