我偶然发现了https://en.cppreference.com/w/cpp/language/operator_precedence
在图表上,我看到后递增运算符(++)远高于赋值运算符(=)。
但是,我知道
int a[] = {10,20};
int* b = &a[0];
*(b++) = 5;
cout << a[0] << endl; // 5
cout << a[1] << endl; // 20
cout << *b << endl; // 20, now points to a[1]
我总是认为后递增发生在赋值运算符之后。但是,如果我遵循操作优先级图表,那么是否不应该在=
操作之前进行后递增操作?答案不应该是a={10, 5}
而不是a={5, 20}
吗?
答案 0 :(得分:2)
“优先级”具有误导性。通常,它与求值顺序(首先发生的事)无关,而是确定每个运算符的操作数是什么,以便进行求值。但是,让我们检查一下您的示例。
*(b++) = 5;
这意味着5
将分配给左侧的左值。从C ++ 17开始,我们知道5
的评估完全在*(b++)
之前。在此之前,可以按任何顺序对其进行评估。
现在,b++
的含义是“递增b
,但要求出其上一个值”。因此,b++
可能导致增量在分配发生之前发生,是的,但是(b++)
的值是增量发生之前的地址。这就是为什么b
在一个表达式中更新为指向下一个元素,同时修改当前元素的原因。
答案 1 :(得分:1)
后递增(b++
)递增b
,然后返回前一个值b
。
预递增(++b
)递增b
,然后返回新值b
。
要获得所需的行为,请从增量递增更改为增量递增。
例如:
#include <iostream>
int main() {
int a[] = {10, 20};
int *b = &a[0];
*(++b) = 5;
std::cout << a[0] << std::endl;
std::cout << a[1] << std::endl;
std::cout << *b << std::endl;
}
产生以下输出:
10
5
5
答案 2 :(得分:0)
表格是正确的。结果没有混淆。 请记住,后增(PI)或自减(DI),在包含 PI 或 DI 的当前语句后执行 +1 或 -1 更新。
*(b++) = 5;
第一个 b++ 将首先发生,因为它在括号中。但是 b 还没有继续下一步。因为编译器总是在后期操作中记住它会在当前语句之后执行它。所以它就像:
*b = 5; // a[0]=5;编译器记住了 b=b+1;执行。
所以现在 b = b+1;
因此 b 现在指向 a[1];