簡體   English   中英

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

[英]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 ,則應將其放在&&表達式的第一位。

如果結果只用左側值可計算,則運算符&&不會評估右側。 我們稱之為短路

一旦successfalse ,將不再調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM