1

我正在閱讀C++,我正在閱讀關於優先順序的一節。關於優先順序(C++)

有,我不太明白的例子,那就是:

11 > 5 || 6 < 15 && 7 >= 8 

「這個邏輯表達式產生不同的結果,取決於||或& &是否首先被計算。如果| |首先被評估,表達式評估爲假如果& &首先被評估,則表達式評估爲真。

如果有人能解釋爲什麼在任何情況下都是真/假,我將不勝感激。感謝您的時間。

+2

你從哪裏得到報價?在C++和其他具有這些運算符的語言中,首先評估&& *。沒有'如果'關於它。 – EJP

+0

@EJP:'&&'比'||'更高的優先級,但這並不意味着&&會首先被評估。在這種情況下,'&&'根本不被評估。 – neverhoodboy

回答

0

如果||首先被評估,您將得到((11 > 5) || (6 < 15)) && (7 >= 8) == (true || true) && false == true && false == false

如果& &首先被評估,您有(11 > 5) || ((6 < 15) && (7 >= 8)) == true || (true && false) == true || true == true

3

如果||首先計算:

(11 > 5 || 6 < 15) && 7 >= 8 
(true || false) && false 
true && false 
false 

如果&&首先計算:

11 > 5 || (6 < 15 && 7 >= 8) 
true || (true && false) 
true || false 
true 
1

&&具有海格優先級比||,所以應該沒有if

11>5的計算結果爲true,這就是整個表達式的值。 ||運算符的第二個操作數(即6 < 15 && 7 >= 8)將不會被評估。

3

運算符&&||的優先級由語言定義,所以引用文本中的「if」沒有多大意義。

「首先評估」一詞具有誤導性。這不是子表達式評估的順序,它是子表達式與||&&運算符關聯的方式。

11 > 5 || 6 < 15 && 7 >= 8 

由於關係運算符的優先級高於(即,,結合除更緊密地)的||&&運營商,上述等效於:

(11 > 5) || (6 < 15) && (7 >= 8) 

這又相當於:

true || true && false 

碰巧,&&具有比||更高的優先級,所以以上相當於:

true || (true && false) 

減少到:

true || false 

true 

在另一方面,如果||有更高的優先級比& &`,然後

true || true && false 

將相當於

(true || true) && false 

true && false 

這是

false 

知道,真的有在這裏沒有選擇是很重要的。該語言明確指出&&||更緊密,所以11 > 5 || 6 < 15 && 7 >= 8無法評估爲false

它發生,不像大多數運營商來說,&&||運營商的操作數嚴格左到右的順序計算,用正確的操作並不是在所有的評估,如果左操作數的值是否足夠以確定結果。這就是所謂的「短路評估」,它可以讓你寫下如下內容:

if (ptr != NULL && *ptr == 42) 

無懼於解除引用空指針。但在這個特殊情況下,這並不重要,因爲這些子表達式都沒有副作用。三個子表達式11 > 5,6 < 157 >= 8可以以6個可能的順序中的任何一個進行評估,其最終結果完全相同。

0

我將解釋以下方法。讓我們忘掉原始表達式,並使用符號名稱a,bc而不是關係。

然後我們會得到兩種形式的記錄

(a || b) && c 

a || (b && c) 

在我們其實運營商& &的兩個操作數首例。如果至少一個操作數爲假,那麼整個表達式也等於假。現在讓我們回到原始表達式。作爲Ç對應於

7 >= 8 

它等於false,所以整個表達式(a || b) && c等於假。

在第二種情況下,我們也有兩個operator ||操作數。如果至少有一個操作數等於true,那麼整個表達式就等於true。作爲一個對應於原始表達式

11 > 5 

等於真,那麼整個表達式a || (b && c)也等於真。