[英]c++ iterator stuck at first value
我正在學習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
為假,則不評估表達式的后半部分。
請注意,您沒有發布update
內容或返回的內容。 因此,我們只能假設可以從update
返回的內容,無論是true
還是false
。
如果您希望始終調用update
,則應將其放在&&
表達式的第一位。
如果結果只用左側值可計算,則運算符&&
不會評估右側。 我們稱之為短路 。
一旦success
為false
,將不再調用update(*i)
。
除了你的代碼的第一個塊(這總是調用update(*i)
一個解決辦法是使用運營商&
代替它總是計算所有兩個參數。 另一個解決方法是寫
success = update(*i) && success;
但這很容易受到頑抗重構的影響。 更好的是,使用
success &= update(*i);
但要注意@Angew的這個評論:
在布爾上下文中使用&=
是危險的。 如果現在update
(或在未來的重構之后)返回一個語義為“非零為真”的int
(參見isdigit
和friends)會怎么樣? 請記住bool(true & 2)
是false
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.