【问题标题】:Assigning to postfix-incremented pointers分配给后缀递增的指针
【发布时间】:2017-10-24 05:00:26
【问题描述】:

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

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

我的想法是

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

【问题讨论】:

    标签: c++ arrays pointers operators rvalue


    【解决方案1】:

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

    错了。

    这里:

    *p++
    

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

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

    你可以将你的 for 循环改写成这样:

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

    为了获得更好的视野。

    【讨论】:

    • 是的,我的错。漫漫长夜。谢谢。
    【解决方案2】:

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

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

    【讨论】:

    • 啊当然。我混淆了点运算符和取消引用运算符。现在看来太傻了。谢谢。
    • 不错的答案 Jodocus,比我早 1 分钟! @ZylonD.Lite,别忘了接受他的回答。
    • 请注意,尽管p++ 在取消引用之前进行了评估; operator++ 的副作用可能在不同时间发生。 (与评估顺序无关)
    猜你喜欢
    • 2016-02-10
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    相关资源
    最近更新 更多