关于优先级和评估顺序的概念存在很多问题,但我找不到涉及我的特殊情况的问题。
请考虑以下声明:
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而不是我的例子,其中包含两个。
答案 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>
,我们就不需要再调用第二个函数。