[英]Operator precedence and evaluation order
我無法理解這個程序的輸出:
#include<iostream>
using namespace std;
int main()
{
int x = 1 , y = 1, z = 1;
cout << ( ++x || ++y && ++z ) << endl; //outputs 1;
cout << x << " " << y << " " << z ; //x = 2 , y = 1 , z = 1;
return 0;
}
輸出:
1
2 1 1
如果||
首先計算那么這個輸出是好的,但是這個文章說, &&
比一個更高的優先級||
,因此必須首先評估。 如果是這種情況那么根據我的輸出應該是:
1
1 2 2
因為++y && ++z
將評估為true
,因此不會評估++x
。
&&
的優先級高於||
,因此必須首先評估。
否。 運算符優先級僅確定運算符在解析表達式時如何更嚴格地(如通過括號)綁定到其參數,它不會影響評估順序。 在這種情況下,它只意味着++x || ++y && ++z
++x || ++y && ++z
將被解析為(++x) || (++y && ++z)
(++x) || (++y && ++z)
,而不是(++x || ++y) && (++z)
。
注意operator||
的關聯性operator||
從左到右,所以首先評估++x
,並且由於短路評估(除了重載operator||
),不會評估(++y && ++z)
)。
讓我們把多余的parantheses放在:
( ++x || (++y && ++z ))
然后很容易看出(++y && ++z )
只有在++x
為0時才會被評估。所以你可以看到,無論運算符優先級如何, ||
的短循環特性 表示僅在左側為0時評估右側。
(如果評估了右側,請注意, 只有當++y
不為0時才會評估++z
)
“優先級”影響分組,而不是順序,並且意味着如果操作數“屬於”哪個運算符可能存在任何歧義,則具有較高優先級的運算符將獲得第一個dib。
由於涉及兩個二元運算符,因此有兩種方法可以讀取表達式。
作為樹木,這些將是:
and
/\
or ++z [(++x || ++y) && ++z]
/ \
++x ++y
or
/\
++x and [++x || (++y && ++z)]
/ \
++y ++z
優先規則確定后一個樹是在C ++中選擇的,因為中間操作數++y
與&&
組合,而不是與||
。
這些運算符的“短路”意味着評估必須從最左邊的葉子開始(每個操作員必須首先評估其左腿,然后如果需要則評估其右側)。
因此,首先評估++x
和||
如果++x
為零,則僅繼續其右腿,而不是。
(從精彩和藝術圖表中可以看出,無論&&
和||
的相對優先級如何,都必須首先評估++x
。)
(++ x ||(++ y && ++ z)) - 可以看作是布爾值 - 只評估++ x。 其int值為2,布爾值為1(true)。
這個表達
++x || ++y && ++z
等同於表達
++x || ( ++y && ++z )
而不是這樣
( ++x || ++y ) && ++z
如果邏輯OR表達式的第一個操作數被計算為true(如在您的示例中),則不計算第二個操作數( ++y && ++z )
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.