给后缀递增指针赋值

3
我读到过后缀递增和递减运算符返回操作数的rvalues。假设这是真的,那么像这样的代码怎么可能存在?:
int arr[5]{};
int *p = arr;
for (int i = 0; i != 5; ++i)
    *p++ = i;

我的思路是

  1. 根据运算符优先级,*p 将首先被计算。
  2. 然后后缀递增将增加值并返回对象的副本作为 rvalue
  3. 然后我感到困惑,因为 rvalues 不应该出现在赋值运算符的左侧...... 所以我的问题基本上是:如何实现 *p++ = i;
2个回答

3
根据运算符优先级,*p 将首先被评估。
错误的。
在这里:
*p++

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

这会产生一个rvalue(指针的值),在解引用之后,它变成了一个lvalue,您可以将其分配给i

您可以将for循环重写为:

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

为了获得更佳的视野。


是的,我错了。昨晚很晚才睡。谢谢。 - Zylon D. Lite

1

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

您错了。根据文档,增量将首先被评估。这将产生一个rvalue(即指针在递增之前的值),然后,在它被解引用之后,它是一个lvalue,您可以进行赋值。


{btsdaf} - Zylon D. Lite
{btsdaf} - gsamaras
{btsdaf} - M.M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接