3

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

#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;
}

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

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

start 2
2???
start 1
1???
start 0
0???

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

4

4 回答 4

13

内置||短路:如果左操作数是true,则不计算右操作数(右操作数的值是什么无关紧要,因为在这种情况下||保证表达式的值true)。

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

于 2012-08-22T19:17:27.143 回答
1

当操作数之一(从左到右计算)可以确定表达式的结果时,布尔运算符||&&短路,而无需参考其余操作数。

在 的情况下||,这意味着如果第一个操作数是true,则不会计算剩余的操作数,因为整个表达式的结果将始终是true

在第一个循环中,recheck本地变量main始终为true,因此test永远不需要评估函数调用:它被跳过,并且您看不到任何输出。

在第二个循环中,test函数调用首先被评估,它的结果只有在调用函数后才能确定,所以每次迭代都会调用函数,你会看到输出。

于 2012-08-22T19:18:10.373 回答
0

其他人已经解决了您提出的具体问题。只是要注意不要连续使用多个问号。三字母序列以两个“??”开头 字符和两个问号后的第三个字符的解释不同。

于 2012-08-22T20:02:21.807 回答
0

你的评论说:

重要的是结果的值与 main() 中重新检查的初始值相反

您的test()函数当前看不到 的值recheck,它是本地的main()

假设您的评论反映了您的意图,您需要将recheck其作为参数传递给test(); 然后您可以使用一元运算!符,例如:

result = ! recheck;

当然,您需要修复其中的逻辑,main()以便test()在需要时调用它。

您的要求不够明确,我无法进一步评论。

于 2012-08-22T19:22:37.350 回答