【问题标题】:C++ operator precedenceC++ 运算符优先级
【发布时间】:2013-02-24 01:41:00
【问题描述】:

假设我们有一个迭代器(iter),它在指向分配给堆空间的内存的指针列表上,如果我这样做的话

delete (*iter++)

优先级是首先取消引用迭代器以获取内存地址然后释放空间然后递增迭代器以释放下一个元素,这对吗?

【问题讨论】:

  • 不要编写需要太多才能弄清楚发生了什么的代码 - 最好将其分散在几行中。这样您就可以防止现在或将来出现错误。
  • 只是为了确保我了解幕后发生的事情......

标签: c++ operators operator-precedence


【解决方案1】:

尽管++ has higher precedence than *,后增量++ 的副作用在取消引用运算符* 使用了迭代器的值之后应用。这是后增量或后缀++ 的行为(与前增量或前缀++ 相对)。此规则适用于迭代器以及“普通”指针。

【讨论】:

    【解决方案2】:

    效果和你写的一样,不过是用稍微不同的顺序实现的:

    1. 后增量具有最高优先级,因此首先对其进行评估。但是,它的返回值(由进一步的运算符处理)是iter增量之前的值。

    2. 接下来评估取消引用,返回 iter 的非递增值“指向”的指针。

    3. delete 最后计算,指针被删除。

    【讨论】:

      【解决方案3】:

      优先级实际上是相反的,如果迭代器是类类型(带有重载的运算符),这是对运算符函数的调用顺序:

      • 调用递增运算符来递增迭代器。它会在增量之前返回自身的副本。
      • 在临时迭代器上调用解引用运算符并返回 iter 曾经调用的列表项的值。
      • 刚刚返回的指针被删除,即指向的对象被破坏,然后内存被释放。

      【讨论】:

        【解决方案4】:

        该行相当于这样:

        delete (*(iter++))
        

        但由于后缀增量返回原始值,您仍然取消引用 iter 的原始值。因此,如果iter 指向一个动态分配对象的指针,delete 将销毁该对象。然后iter 将一直指向下一个指针。

        【讨论】:

          猜你喜欢
          • 2017-06-02
          • 1970-01-01
          • 2021-03-29
          • 2013-07-31
          • 1970-01-01
          • 2013-02-09
          • 2014-03-01
          相关资源
          最近更新 更多