[英]Regarding Order of Precedence (c++)
我正在閱讀C ++,並且正在閱讀有關優先順序的部分。
有一個我不太了解的例子,那就是:
11 > 5 || 6 < 15 && 7 >= 8
“根據首先評估||或&&,此邏輯表達式產生不同的結果。如果首先評估||,則該表達式的值為false。如果首先評估&&,則該表達式的值為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 || 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
11 > 5 || 6 < 15 && 7 >= 8
可以計算為false
。
碰巧,與大多數運算符不同, &&
和||
的操作數 運算符以從左到右的嚴格順序求值,如果左操作數的值足以確定結果,則完全不評估右操作數。 這稱為“短路評估”,它使您可以編寫如下內容:
if (ptr != NULL && *ptr == 42)
不用擔心取消引用空指針。 但這在此特定情況下無關緊要,因為所有子表達式都沒有副作用。 可以按照6個可能的順序中的任何一個對三個子表達式11 > 5
6 < 15
和7 >= 8
進行求值,最終結果完全相同。
&&
優先級高於||
,所以應該沒有if
。
11>5
計算結果為true,這就是整個表達式的值。 ||
的第二個操作數 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 || (true && false) == true || true == true
(11 > 5) || ((6 < 15) && (7 >= 8)) == true || (true && false) == true || true == true
。
我將解釋以下方式。 讓我們忘記原始表達式,它將使用符號名a , b和c代替關系。
然后我們將獲得兩種形式的記錄
( a || b ) && c
和
a || ( b && c )
在第一種情況下,實際上我們有兩個運算符&&的操作數。 如果至少一個操作數為假,則整個表達式也等於假。 現在讓我們返回原始表達式。 由於c對應
7 >= 8
它等於false,因此整個表達式( a || b ) && c
等於false。
在第二種情況下,我們還有兩個運算符||的操作數。 如果至少一個操作數等於true,則整個表達式等於true。 作為對應於原始表達式
11 > 5
那等於true那么整個表達式a || ( b && c )
a || ( b && c )
也等於true。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.