簡體   English   中英

運算符優先級和評估順序

[英]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.

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