繁体   English   中英

c ++逻辑替代运算符

[英]c++ logical alternative operator

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

#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)甚至没有被调用。 我怀疑它与|| 运营商。 任何人都可以解释这种行为吗?

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

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

布尔运算符|| 当其中一个操作数(从左到右进行评估)可以确定表达式的结果而不参考剩余的操作数时, &&短路

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

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

在第二个循环中,首先计算test函数调用,并且只能在调用函数后确定结果,因此在每次迭代时都会调用该函数,并且您会看到输出。

你的评论说:

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

你的test()函数当前看不到recheck的值,这是main()本地值。

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

result = ! recheck;

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

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

其他人已经解决了您提出的具体问题。 请注意,要注意连续使用多个问号。 Trigraph序列以两个'??'开头 字符和两个问号后的第三个字符的解释方式不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM