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