簡體   English   中英

關於優先順序(c ++)

[英]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 < 157 >= 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

我將解釋以下方式。 讓我們忘記原始表達式,它將使用符號名abc代替關系。

然后我們將獲得兩種形式的記錄

( 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM