Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的增量后与分配后比较+;操作优先表_C++_Operator Precedence - Fatal编程技术网

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;