分配给后缀递增的指针

Assigning to postfix-incremented pointers

我读过操作数的后缀递增和递减运算符 return rvalues。假设这是真的,这样的代码怎么可能?:

int arr[5]{};
int *p = arr;
for (int i = 0; i != 5; ++i)
    *p++ = i;

我的思路是

  1. 根据运算符优先级,*p 将首先计算。
  2. 然后后缀增量将增加值和return 对象的副本作为右值
  3. 然后我感到困惑,因为右值不应该在赋值运算符的左侧...... 所以我的问题基本上是:*p++ = i; 怎么可能?

According to operator precendence, *p will get evaluated first.

你错了。根据documentation,先计算增量。这将产生一个右值(即指针在递增之前的值),然后在它被取消引用后,它是一个 lvalue 你可以分配给。

According to operator precendence, *p will get evaluated first.

错了。

这里:

*p++

首先计算增量,而不是 *p

这给出了一个右值(指针的值),在取消引用之后,它变成了一个左值,您可以将其分配给 i

您可以将 for 循环重写为:

for (int i = 0; i != 5; ++i) {
    std::cout << *p << std::endl;
    *p++ = i;
    std::cout << *p << std::endl;
}

获得更好的视野。