c ++迭代器卡在第一个值

时间:2015-12-16 08:13:33

标签: c++

我正在学习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);        
}

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

2 个答案:

答案 0 :(得分:14)

这两段代码不等于

第一个总是调用update,而第二个不调用&&。原因是short-circuit boolean evaluation执行了success。如果update为false,则不评估表达式的后半部分。

请注意,您没有发布update或返回的内容。因此,我们只能假设可以从true返回的内容可以是falseupdate

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

答案 1 :(得分:4)

如果仅使用左侧值可计算结果,则运算符false将不会评估右侧。我们称之为短路

update(*i)update(*i)后,&将不再被调用。

除了你的第一个代码块(总是调用success = update(*i) && success;)之外,还有一个修复方法是使用运算符success &= update(*i);来代替它,它总是计算两个参数。另一个解决方法是编写

&=

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

update

但请注意@Angew的评论:

在布尔上下文中使用int是危险的。如果bool(true & 2)现在(或在未来的重构之后)返回false并且语义为“非零为真”(参见isdigit和朋友),该怎么办?请注意,function sendEmailToArray($subscribers_email){ //$subscribers_email = array( // 'email_1@xxx.com', // 'email_2@xxx.com', // 'email_3@xxx.com' //); $final_subscribers_email = array(); foreach ($subscribers_email as $key => $value) { array_push($final_subscribers_email, array("email" => $value)); } $mandrill_message = array( // ...blah blah, doesn't matter // To send to only one email address: 'to' => $final_subscribers_email, // ...blah blah, doesn't matter ); } 为{{1}}。