C ++使用逻辑运算符评估Subexpressions的顺序

时间:2015-06-28 15:12:59

标签: c++ operator-precedence

关于优先级评估顺序的概念存在很多问题,但我找不到涉及我的特殊情况的问题。

请考虑以下声明:

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

保证是否会首先评估f(0)?请注意,运营商是&&。

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

在本书的第10.3.2节中,它说:

  

表达式中子表达式的评估顺序为 undefined 。特别是,您不能假设表达式是从左到右计算的。例如:

     

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

这似乎适用于所有运营商包括&&运营商,但在以下段落中说:

  

运营商,(逗号),&& (逻辑和),和|| (逻辑或)保证他们的左手操作数在他们的右手操作数之前被评估。

第11.1.1节还提到了另一个问题:

  

&&和||运营商仅在必要时评估其第二个参数,因此它们可用于控制评估顺序(第10.3.2节)。例如:

     

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

     

这里,如果是nullp,则不会取消引用p。

最后一句话暗示&&和||首先评估他们的第一个参数,所以它似乎强化了我的假设,即第二个引用中提到的运算符是第一个引用的例外,但我也无法从最后一个例子中得出明确的结论,因为表达式只包含一个 subexpression而不是我的例子,其中包含两个

2 个答案:

答案 0 :(得分:5)

{C}和C ++中已经建立了&&||,的特殊排序行为。你引用的第一句话应该说"表达式中子表达式的评估顺序通常是不明确的"或者"除了一些特定的例外,表达式中子表达式的评估顺序是未定义的,#34;。

您询问了C ++,但this question中的C FAQ list是相关的。

答案 1 :(得分:1)

是的,保证false将首先完全评估。

这是为了支持称为短路的行为,如果第一个函数返回<div class='content'> <form id='submit' action='' method=''> <input type='text' autofocus='on' placeholder='Search with DuckDuckGo' autocomplete='off' id='searchBox'> </form> <p>Lorem</p> <p>Lorem</p> <p>Lorem</p> </div> ,我们就不需要再调用第二个函数。