繁体   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