我正在閱讀C++,我正在閱讀關於優先順序的一節。關於優先順序(C++)
有,我不太明白的例子,那就是:
11 > 5 || 6 < 15 && 7 >= 8
「這個邏輯表達式產生不同的結果,取決於||或& &是否首先被計算。如果| |首先被評估,表達式評估爲假如果& &首先被評估,則表達式評估爲真。
如果有人能解釋爲什麼在任何情況下都是真/假,我將不勝感激。感謝您的時間。
我正在閱讀C++,我正在閱讀關於優先順序的一節。關於優先順序(C++)
有,我不太明白的例子,那就是:
11 > 5 || 6 < 15 && 7 >= 8
「這個邏輯表達式產生不同的結果,取決於||或& &是否首先被計算。如果| |首先被評估,表達式評估爲假如果& &首先被評估,則表達式評估爲真。
如果有人能解釋爲什麼在任何情況下都是真/假,我將不勝感激。感謝您的時間。
如果||
首先被評估,您將得到((11 > 5) || (6 < 15)) && (7 >= 8) == (true || true) && false == true && false == false
。
如果& &首先被評估,您有(11 > 5) || ((6 < 15) && (7 >= 8)) == true || (true && false) == true || true == true
。
如果||
首先計算:
(11 > 5 || 6 < 15) && 7 >= 8
(true || false) && false
true && false
false
如果&&
首先計算:
11 > 5 || (6 < 15 && 7 >= 8)
true || (true && false)
true || false
true
&&
具有海格優先級比||
,所以應該沒有if
。
11>5
的計算結果爲true,這就是整個表達式的值。 ||
運算符的第二個操作數(即6 < 15 && 7 >= 8
)將不會被評估。
運算符&&
和||
的優先級由語言定義,所以引用文本中的「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 < 15
和7 >= 8
可以以6個可能的順序中的任何一個進行評估,其最終結果完全相同。
我將解釋以下方法。讓我們忘掉原始表達式,並使用符號名稱a,b和c而不是關係。
然後我們會得到兩種形式的記錄
(a || b) && c
和
a || (b && c)
在我們其實運營商& &的兩個操作數首例。如果至少一個操作數爲假,那麼整個表達式也等於假。現在讓我們回到原始表達式。作爲Ç對應於
7 >= 8
它等於false,所以整個表達式(a || b) && c
等於假。
在第二種情況下,我們也有兩個operator ||操作數。如果至少有一個操作數等於true,那麼整個表達式就等於true。作爲一個對應於原始表達式
11 > 5
等於真,那麼整個表達式a || (b && c)
也等於真。
你從哪裏得到報價?在C++和其他具有這些運算符的語言中,首先評估&& *。沒有'如果'關於它。 – EJP
@EJP:'&&'比'||'更高的優先級,但這並不意味着&&會首先被評估。在這種情況下,'&&'根本不被評估。 – neverhoodboy