我正在学习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);
}
我的印象是第二个版本总是采用迭代器的初始值。有人可以解释一下原因吗?
答案 0 :(得分:14)
这两段代码不等于。
第一个总是调用update
,而第二个不调用&&
。原因是short-circuit boolean evaluation
执行了success
。如果update
为false,则不评估表达式的后半部分。
请注意,您没有发布update
或返回的内容。因此,我们只能假设可以从true
返回的内容可以是false
或update
。
如果您希望始终调用&&
,则应将其放在{{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}}。