分配给后缀递增的指针

时间:2017-10-24 05:00:27

标签: c++ arrays pointers operators rvalue

我已经读过postfix增量和减量运算符返回操作数的 rvalues 。假设这是真的,这样的代码怎么可能?:

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

我的思考过程是

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

2 个答案:

答案 0 :(得分:2)

  

根据操作员的优先顺序,* p将首先得到评估。

错误。

下面:

*p++

首先评估增量,而不是*p

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

您可以将for循环重写为:

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

以获得更好的观点。

答案 1 :(得分:1)

  

根据运算符的优先级,*p将首先得到评估。

你错了。根据{{​​3}},将首先评估增量。这将产生一个rvalue(即指针在递增之前的值),然后,在它被取消引用之后,是一个你可以分配给它的 lvalue