我最近在代码中有一个拼写错误,在某些情况下会导致无限循环(但似乎并非在所有环境中都如此)。
它看起来像这样:
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
, c
和d
可以按任何 顺序求值。 a+b
必须在 a
和 b
之后计算,(a+b)*c
在 (a+b)*c
之后计算 a+b
和 c
,以及 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/