#include <iostream.h>
int main()
{
int a = 2;
int b = 3;
a++ += b;
std::cout << a;
}
我对此的理解是,该表达式将首先求a + b的值,将该值存储在a中,然后将其递增。这是怎么回事?
答案 0 :(得分:8)
这是一个错误 1 :
a++ += b
因为a++
返回一个临时语言(a pr-value),该语言禁止您修改该语言,因为一旦对完整表达式求值就将其丢弃。这是一种故障保险。
我对此的理解是,该表达式将首先计算a + b,将该值存储在a中,然后将其递增。
不,不是。根据{{3}},++
在+=
之前评估。
1)此答案假定a
和b
是内置类型或行为良好的用户定义类类型。
答案 1 :(得分:0)
对于内建类型,这是一个编译时错误,因为赋值需要一个左值,而a ++(这是由于首先评估了运算符的优先级)是一个右值。在您的示例中,编译器将发出类似see compiler-explorer的错误:
<source>: In function 'int main()':
<source>:6:9: error: lvalue required as left operand of assignment
6 | a++ += b;
| ^
Compiler returned: 1
如果您的自定义类型(在本例中为废话,仅用于演示)
class A
{
public:
A operator++(int)
{
return A{};
}
A operator+=(const A&)
{
return A{};
}
int i;
};
int main()
{
A a;
A b;
a++ += b;
return 0;
}
它编译没有问题,因为a ++现在会产生一个左值。
答案 2 :(得分:0)
除了错误的入口点和标头之外,此代码还有两个问题。
a
被定义为const
,因此它不能是左值,因此不受++或+ =运算符或任何赋值的影响。这是一个常数!
增量运算符++也不会返回左值,因此其结果不能是赋值运算符的参数。