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