C ++运算符优先级

时间:2013-03-08 13:37:17

标签: c++ operators operator-precedence

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

delete (*iter++)

我是对的,首先是取消引用迭代器获取内存地址然后释放空间然后增加迭代器以释放下一个元素?

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

效果就像你写的那样,但它是用一个稍微不同的顺序实现的:

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

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

  3. 最后评估
  4. delete,并删除指针。

答案 2 :(得分:1)

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

  • 调用increment运算符以递增迭代器。它会在增量之前返回的副本。
  • 在临时迭代器上调用dereference运算符,并返回iter用于调用的列表项的值。
  • 删除刚返回的指针,即销毁指向的对象,然后释放内存。

答案 3 :(得分:0)

该行等同于:

delete (*(iter++))

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