相关疑难解决方法(0)

逻辑AND,OR:是否保证从左到右的评估?

是否&& ||保证逻辑运算符()的从左到右的评估?

假设我有这个:

SDL_Event event;

if (SDL_PollEvent(&event)) {
    if (event.type == SDL_QUIT) {
            // do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

这保证与此相同吗?

SDL_Event event;

if (SDL_PollEvent(&event) && event.type == SDL_QUIT) {
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

这也很重要,假设我们有两个要求,a并且b.因此,要求a更有可能失败b.然后说它if (a && b)比说更有效率if (b && a).

c++ operator-precedence logical-operators

27
推荐指数
1
解决办法
1万
查看次数

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

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

请考虑以下声明:

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不被解除引用.

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

c++ operator-precedence

5
推荐指数
1
解决办法
557
查看次数