2016-02-14 55 views
0

我對下面的程序有些困惑。在我的if語句中,我調用布爾函數兩次。對於i和j變量,我應該執行「else」語句,因爲這兩個函數調用都會生成true。但我的「我」變量沒有被修改(它輸出爲1001而不是1000),我不知道爲什麼。 j變量正在按預期進行修改。第一個函數調用傳入「j」變量,第二個函數調用傳入「i」變量。有人可以解釋爲什麼「我」變量沒有被修改?if語句中的布爾函數調用

#include <iostream> 
using namespace std; 

const int MINCOLOR = 0; 
const int MAXCOLOR = 1000; 

bool clipColor(int &amountColor); 


int main() 
{ 
    int i=1001; 
    int j = 3333; 
    int k; 
    bool check; 

    if (clipColor(j) == false && clipColor(i) == false) 
    { 
     check = false; 
    } 
    else 
    { 
     check = true; 
    } 

    cout << i << " " << j << " " << check << " " << endl; 
    return 0; 
} 


bool clipColor(int &amountColor)  
{ 
    if (amountColor > MAXCOLOR) 
    { 
    amountColor = MAXCOLOR; 
    return true; 
    } 
    else if (amountColor < MINCOLOR) 
    { 
    amountColor = MINCOLOR; 
    return true; 
    } 
    else 
    { 
    return false; 
    } 
} 

回答

0

這是因爲&&||操作員的工作原理。對於&&,如果第一個操作數爲假,則第二個操作數永遠不會被評估。因此,不進行第二次函數調用。

這就是所謂的short-circuit evaluation,它不僅是C和C++的一個特性,而且也是大多數編程語言的一個特性。

如果您明確要評估雙方,那麼對於bool返回,單個&運營商可以說是做你想做的。根據規範,它可以進行按位AND操作,但由於bool值僅使用一位,所以結果應該完全符合您的需要。

另外,clipColor(j) == false!clipColor(j)相同。

+0

我敢肯定,我們有這個問題的一個騙局。 –

+0

謝謝一堆。 \ – nm17

+0

有沒有什麼辦法可以讓第二個函數調用被評估? – nm17

0

在你的代碼

if (clipColor(j) == false && clipColor(i) == false) 
{ 
    check = false; 
} 
else 
{ 
    check = true; 
} 

功能clipcolor(j)正在執行第一和返回true。 因此,無需執行clipColor(i),因爲無論值clipColor(i)何時返回,條件(clipColor(j) == false && clipColor(i) == false)將始終爲假。