2017-08-14 99 views
-1

所以我無法弄清楚背後的邏輯這個if語句麻煩的邏輯非常簡單的if語句

int found = 0, value = 5; 
if (!found || ‐‐value == 0) 
cout << "danger "; 
cout << "value = " << value << endl; 

爲什麼「危險」寫到這裏的屏幕很簡單呢?我以爲自從找到= 0,!找到的不等於零。

+1

因爲'found'不等於'0'(或'FALSE',我會說)。 – LogicStuff

+4

答案在你的問題:「自找到= 0,!找到不等於零」,因此測試條件必須爲真。 –

+0

這可能是短暫的cuircit混淆你?你會得到相同的'if(!found){cout <<「danger」; }'因爲如果第一個操作數是真的,第二個沒有被評估 – user463035818

回答

2

看來你正在考慮在if語句的條件通過以下方式

if ((!found == 0) || (‐‐value == 0)) 

然而,在C++中的if語句的條件相當於

if ((!found) || (‐‐value == 0)) 

,反過來相當於

if ((found == 0) || (‐‐value == 0)) 

因此,如果找到的確實等於0,那麼這個子表達式(found == 0)就是真的,它是邏輯OR運算符的結果。

+0

從我的腦海裏發瘋Vlad!非常感謝我的思考過程,非常感謝。真的很感激它。 – SuchARush

+0

@SuchARush根本沒有。歡迎您。:) –

0

可以分解測試語句轉換成這是更接近編譯器做什麼邏輯:

if (!found || --value == 0) 
{ 
    cout << "danger"; 
} 

是由編譯器的東西接近這個(擴展位爲例如邏輯理解,因爲大會實際上生成使用反向邏輯...)。

if (found == 0) // !found 
{ 
    cout << "danger"; // if this is executed, the next test is not ! 
} 
else if (--value == 0) 
{ 
    cout << "danger"; 
} 

編譯器使用反向邏輯,所以它並沒有產生兩倍的cout << "danger"聲明。

爲:

if (found == 0) 
{ 
    goto print_danger; 
} 
else 
{ 
    -- value;  // this statement is never executed if (found == 0) 
    if (value != 0) 
    { 
     goto skip_print_danger; 
    } 
} 

print_danger: 
    cout << "danger"; 

skip_print_danger: 
cout << "value = " << value; 
+0

好的一面。謝謝 :) – SuchARush