簡體   English   中英

用邏輯運算符評估Subexpressions的C ++順序

[英]C++ Order of Evaluation of Subexpressions with Logical Operators

關於優先級評估順序的概念有很多問題,但我沒有找到一個涉及我的特殊情況的問題。

請考慮以下聲明:

if(f(0) && g(0)) {};

是否保證首先評估f(0)? 請注意,運算符是&&。

我的困惑源於我在“The C ++ Programming Language,(Stroustrup,4ed,2013)”中所讀到的內容。

在本書的第10.3.2節中,它說:

表達式中子表達式的評估順序是不確定的 特別是,您不能假設表達式是從左到右計算的。 例如:

int x = f(2)+ g(3); // undefined是否先調用f()或g()

這似乎適用於包括 &&運算符在內的所有運算符,但在后面的段落中它說:

運算符,(逗號),&&(邏輯和)和|| (邏輯或) 保證在其右側操作數之前評估其左側操作數。

第11.1.1節還提到了另一個問題:

&&和|| 運營商僅在必要時評估其第二個參數,因此它們可用於控制評估順序(第10.3.2節)。 例如:

while(p &&!whitespace(p))++ p;

這里,如果它是nullptr,則p不被解除引用。

最后一句話暗示了&&和|| 首先評估他們的第一個參數,所以它似乎強化了我的假設,即第二個引用中提到的運算符是第一個引用的例外,但我也無法從最后一個例子中得出明確的結論,因為表達式只包含一個子表達式而不是我的例子,其中包含兩個

&&||的特殊排序行為 ,是行之有效的在C和C ++。 您引用的第一個句子應該說“表達式中子表達式的評估順序通常是未指定的”或“除少數特定例外情況外,表達式中子表達式的評估順序未指定”。

您詢問了C ++,但C FAQ列表中的這個問題是相關的。


附錄:我剛剛意識到“未指明”在這些規則中比“未定義”更好。 f() + g()類的東西不會給你未定義的行為。 你無法知道是否可以先調用fg

是的,保證首先完全評估f(0)

這是為了支持稱為短路的行為,如果第一個返回false ,我們根本不需要調用第二個函數。

暫無
暫無

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

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