簡體   English   中英

比較運算符的評估順序?

[英]order of evaluation of comparison operator?

我了解到邏輯運算符可以保證從左到右進行評估,但是我想知道比較運算符的評估順序是什么。 換句話說,例如expression1 < expression2可以確保在expression1之前先對expression2進行求值。

根據標准:

J.1未指明的行為

未指定以下內容:
....

—除了為函數調用()&&||指定的子表達式的計算順序和副作用發生的順序 ?:和逗號運算符(6.5)。

一般來說,表達式中子表達式的求值順序是不確定的。

唯一有順序(即順序點)的地方是|| (邏輯OR) && (邏輯與) , (逗號),和?: (三元)運算符。

&&的情況下,如果左側的表達式的計算結果為false(即0),則已知結果為false,並且不對右側的結果求值。 對於||同樣 如果左側的表達式求值為true(即不為0),則結果為true,而右側的表達式不求值。

對於三元運算符,首先評估條件。 如果評估結果為true,則僅評估中間部分,否則僅評估第三部分。

對於逗號運算符,首先評估左側,然后評估右側。

C標准

6.5.13.4與按位二進制&運算符不同,&&運算符保證從左到右的求值; 在第一個操作數求值之后有一個序列點。 如果第一個操作數比較等於0,則不評估第二個操作數。

...

6.5.14.4與按位| 運算符,|| 運營商保證從左到右的評估; 在第一個操作數求值之后有一個序列點。 如果第一個操作數比較不等於0,則不計算第二個操作數。

...

6.5.15.4計算第一個操作數; 評估后有一個序列點。 僅當第一個操作數不等於0時,才對第二個操作數求值; 僅當第一個操作數等於0時,才計算第三個操作數; 結果是第二個或第三個操作數的值(以所評估的為准),轉換為以下所述的類型。 如果試圖修改條件運算符的結果或在下一個序列點之后訪問它,則行為是不確定的。

....

6.5.17.2逗號運算符的左操作數被評估為void表達式; 評估后有一個序列點。 然后評估正確的操作數; 結果具有其類型和價值。 如果試圖修改逗號運算符的結果或在下一個序列點之后訪問它,則行為是不確定的。

不,該規范提及關系運算符的操作數的評估順序 未指定。

只需補充一下, 關系運算符是從左到右的關聯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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