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

Kem*_*mal 5 c++ operator-precedence

关于优先级评估顺序的概念有很多问题,但我没有找到一个涉及我的特殊情况的问题.

请考虑以下声明:

if(f(0) && g(0)) {};
Run Code Online (Sandbox Code Playgroud)

是否保证首先评估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不被解除引用.

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

Ste*_*mit 4

的特殊排序行为&&,||以及,源远流长的C和C++.您引用的第一个句子应该说"表达式中子表达式的评估顺序通常是未定义的"或"除了一些特定的例外情况,表达式中子表达式的评估顺序是未定义的".

您询问了C++,但C FAQ列表中的这个问题是相关的.