c++ -++iter = iter 期间发生了什么?

标签 c++

我最近在代码中有一个拼写错误,在某些情况下会导致无限循环(但似乎并非在所有环境中都如此)。
它看起来像这样:

for (std::vector<myString>::iterator iter = myVector.begin(); iter != myVector.end(); ++iter = iter)
{
   ...
}

拼写错误是迭代器对其自身的赋值。删除它可以解决问题。

我想知道在语句++iter = iter 中到底发生了什么?
我以为按照运算符优先级,iterator应该先自增,再赋值给self,但是我好像漏掉了一些步骤(不然不会死循环)
我的感觉是它还涉及变量的取消引用,但我不确定完全理解这个错误发生了什么。
另外,为什么它在某些平台上似乎不会导致无限循环?

最佳答案

according to operator precedence, iterator should first be incremented, then assigned to self

运算符优先级不决定求值顺序。

如果表达式 d = (a+b)*c, a, b, cd 可以按任何 顺序求值。 a+b 必须在 ab 之后计算,(a+b)*c(a+b)*c 之后计算 a+bc,以及 d 和乘法结果之后的赋值结果,仅此而已。

同样的过去也是作业。

作业的左侧和右侧以前可以以任何顺序求值。特别是,可以实现以下顺序:

  • iter 被评估,产生一个我们称之为 temp
  • 的值
  • ++iter 被评估(这不影响 temp)
    • 这导致 iter 递增,值是新递增的 iter rvalue
  • temp 被分配给上面评估的 iter rvalue
  • 最终结果是 iter 保持不变

另一个评估顺序也曾经是可能的。

  • ++iter 被计算
    • 这导致 iter 递增,值是新递增的 iter rvalue
  • iter(赋值的右边)被再次计算
    • 结果是新增加的 iter 转换为 lvalue
  • 赋值发生,iter 按预期递增。

但是 C++17 has changed this .赋值现在严格从右到左求值。这意味着第一个评估顺序现在保证,第二个不允许。

关于c++ -++iter = iter 期间发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53382444/

相关文章:

c++ - 在可变参数模板内使用 std::bind 完美转发引用

c++ - 与 C++ 相比,用 Python 编写的 wxWidget 慢多少?

c++ - 初始化一个 constexpr std::array of pairs

c++ - 我试图显示对象数组,但它给出了错误的输出

c++ - 程序不终止

C++ 排序真假数组

C++ linux 调整 Xterm 大小

c++ - 使用 Docker 构建已编译的应用程序

c++ - 是否有没有 C 陷阱的 C++ 风格的语言?

c++ - 如何将特定大小的数组作为参数传递?