c++迭代器停留在第一个值

c++ iterator stuck at first value

本文关键字:第一个 停留在 迭代器 c++      更新时间:2023-10-16

我正在学习c++,遇到了一些无法解释的行为。下面的两段代码提供了不同的结果,而我希望它们是等效的:

success = true;
vector<instruction>::const_iterator i;
for (i = instructions.begin(); i != instructions.end(); ++i) {
    bool up = update(*i);
    success = success && up;        
}

success = true;
vector<instruction>::const_iterator i;
for (i = instructions.begin(); i != instructions.end(); ++i) {
    success = success && update(*i);        
}

我的印象是,第二个版本总是采用迭代器的初始值。有人能解释一下原因吗?

这两段代码并不等价。

第一个总是调用update,而第二个则不会。原因是&&做了一种叫做short-circuit boolean evaluation的事情。如果success为false,则不计算表达式的后半部分。

请注意,您没有发布update是什么或返回了什么。因此,我们只能假设能够从update返回什么,它将是truefalse

如果希望始终调用update,则应将其放在&&表达式的第一位。

如果结果仅使用左手边值即可计算,则运算符&&将不会计算右手边。我们称之为短路

一旦successfalse,就不再调用update(*i)

除了第一个代码块(它总是调用update(*i))之外,一个修复方法是使用运算符&,它总是计算两个参数。另一个解决方案是写入

success = update(*i) && success;

但这很容易受到难以抗拒的重构的影响。更好的是,使用

success &= update(*i);

但请注意@Angew:的评论

在布尔上下文中使用&=是危险的。如果update现在(或在未来的重构之后)返回一个语义为"非零为真"的int(参见isdigit和friends),该怎么办?请记住,bool(true & 2)就是false

相关文章: