有很多与优先级
和求值顺序
概念相关的问题,但我没有找到一个涉及到我特殊情况的。
请考虑下面的陈述:
if(f(0) && g(0)) {};
是否保证 f(0) 会被先计算?注意运算符是 &&。
我的困惑源于我在 “The C++ Programming Language, (Stroustrup, 4ed, 2013)” 中读到的内容。
该书第10.3.2节中写道:
表达式中子表达式的计算顺序是未定义的。特别地,不能假设表达式从左到右计算。例如:
int x = f(2)+g(3); // 不确定是先调用 f() 还是 g()
这似乎适用于包括 && 运算符在内的所有运算符,但在接下来的一段中它说:
,(逗号)、&&(逻辑与)和 ||(逻辑或)运算符保证它们的左操作数在其右操作数之前被计算。
该书的第11.1.1节中还提到了另一个例子:
&& 和 || 运算符仅在必要时计算其第二个参数,因此它们可以用于控制求值顺序(§10.3.2)。例如:
while (p && !whitespace(p)) ++p;
在此,如果 p 是 nullptr,则不会对其进行解引用。
这个最后的引用暗示了 && 和 || 先计算它们的第一个参数,因此它似乎加强了我对第二个引用是第一个引用的例外的假设,但我也无法从这个最后的例子中得出最终结论,因为该表达式只包含一个子表达式,而不像我的例子一样包含两个。
f
或g
哪个先被评估,那么你已经自己回答了。 - Otomo