C++ C+中的增量后与分配后比较+;操作优先表
我偶然发现 在图表上,我看到后增量运算符(++)远高于赋值运算符(=) 然而,我知道C++ C+中的增量后与分配后比较+;操作优先表,c++,operator-precedence,C++,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] inta[]={10,20};
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]
inta[]={10,20};
int*b=&a[0];
*(b++)=5;
coutPost increment(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;
}
“优先”具有误导性。一般来说,它与求值顺序(首先发生什么)没有什么关系,而是确定每个运算符的操作数,以便求值。但让我们来看看你的例子
*(b++) = 5;
这意味着将5
分配给左侧的左值。从C++17开始,我们知道5
是在*(b++)
之前被完全计算的。在此之前,可以按任何顺序对其进行评估
现在,b++
的含义是“增量b
,但计算为其先前的值”。因此,b++
可能导致增量发生在分配发生之前,是的,但是(b++)
的值是增量发生之前的地址。这就是为什么b
在一个表达式中更新为指向下一个元素,同时修改当前元素的原因。表是正确的。结果并不混乱。
只需记住这样一个事实,即递增(PI)或递减(DI)后,在包含PI或DI的当前语句之后执行+1或-1更新
*(b++)=5强>
第一个b++将首先发生,因为它在括号中。但是b还没有下一步行动。正如编译器在post操作中始终记住的,它将在当前语句之后执行它。所以它就像:
*b=5;//a[0]=5;编译器b=b+1;待执行
现在b=b+1
因此b现在指向a[1] 不必使用int
来检查应用的运算符的顺序行为,您可以编写一个测试类来重载所有这些有问题的运算符。哦,我明白了*(b++)实际上是在赋值运算符之前求值的,但由于后增量基本上是一个返回增量之前的值的函数(在本例中为&a[0]),因此结果看起来好像后增量是在赋值之后完成的。那么,这是否意味着后增量运算符需要额外的内存(存储返回的原始值)?@pbeta-可能,可能不是。对于您问题中的情况,允许编译器在赋值后实际执行增量。原因是您的程序的可观察行为保持不变,因此在假设规则下,这样的优化是可能的。如果它是一个重载运算符,则可能会占用更多的空间。但不管怎样,如果我真的需要一个后增量,我都不会为此烦恼。
*(b++) = 5;