c ++逻辑替代运算符

Moo*_*min 3 c++ operator-precedence logical-operators

在一个简单的项目工作期间,我发现了一些我不完全理解的情况.考虑以下代码:

#include <iostream>

using namespace std;

bool test(int k)
{
    cout << "start " << k << endl;

    bool result; // it is important that result's value is opposite to initial value of recheck in main()
    result = false;

    return result;
}

int main()
{
    bool recheck;
    recheck = true;
    for (int i = 2; i > -1; i--)
    {
      recheck = (recheck || test(i));   // (1)
      cout << i << " ???" <<endl;
    }
    cout << "----------------------------" << endl;
    cout << endl;

    recheck = true;
    for (int i = 2; i > -1; i--)
    {
        recheck = (test(i) || recheck);  //different order that in (1)
        cout << i << "???" <<endl;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它从for循环返回完全不同的结果:

2 ???
1 ???
0 ???
----------------------------

start 2
2???
start 1
1???
start 0
0???
Run Code Online (Sandbox Code Playgroud)

似乎第一个test(int k)甚至没有被调用.我怀疑它与||运营商有关.任何人都可以解释这种行为吗?

Jam*_*lis 13

内置||短路:如果左操作数是true,则不评估右操作数(右操作数的值是什么并不重要,因为在这种情况下||表达式的值保证不变true).

为了完整性,但与问题并不特别相关:在c ++中,||运算符是可重载的,就像许多其他运算符一样.如果使用过载,则不会发生短路.

  • 不,这不能被禁用.这是该语言的基本特征.但是,如果两个操作数都已经是`bool`类型,并且您要将结果存储在`bool`中(或者将结果转换为`bool`),请使用`|`运算符.它不会短路.(它的语义不同,但如果两个操作数都是`bool`类型,结果用作`bool`,它与`||`运算符具有相同的行为,没有短路.) (2认同)