[英]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不被解除引用。
最后一句話暗示了&&和|| 首先評估他們的第一個參數,所以它似乎強化了我的假設,即第二個引用中提到的運算符是第一個引用的例外,但我也無法從最后一個例子中得出明確的結論,因為表達式只包含一個子表達式而不是我的例子,其中包含兩個 。
是的,保證首先完全評估f(0)
。
這是為了支持稱為短路的行為,如果第一個返回false
,我們根本不需要調用第二個函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.