【问题标题】:Logical error with the || operator?|| 的逻辑错误操作员?
【发布时间】:2012-04-29 17:35:47
【问题描述】:

我的程序的一部分(如果需要,我可以添加更多细节)包含这一行:

if((e->start->explored = false) || (e->end->explored = false)){
   //do action...
 } 

这是图算法的一部分,其中 e 是具有事件顶点“开始”和“结束”的有向边。如果 e 的至少一个事件顶点未被探索,我希望“行动”发生,但这种逻辑似乎是错误的。虽然我使用了一个小例子并验证了我的边的开始和结束顶点确实是未经探索的,但我的整个函数正在进入一个无限循环。

然后我这样测试它:

  if((e->start->explored = false) || (e->end->explored = false)){
       //do action...
     } 

  else cout << "FAIL"; 

...当然,它打印了一个“失败”的屏幕。我的逻辑错误是什么?

【问题讨论】:

    标签: c++ logical-operators


    【解决方案1】:

    您将false 分配给您的属性,而不是针对false 进行测试。这是一个经常犯的错误,而且很难调试。将您的 = 赋值运算符更改为相等运算符 ==

    if((e->start->explored == false) || (e->end->explored == false)) {
        // Do action...
    } else {
        cout << "FAIL";
    }
    

    与其将值与false 进行比较,不如使用! not 运算符更清晰。内括号也被取消了:

    if(!e->start->explored || !e->end->explored) {
        // Do action...
    } else {
        cout << "FAIL";
    }
    

    【讨论】:

      【解决方案2】:

      正如其他人所阐述的那样,您不小心使用了赋值而不是比较。但是,真正的解决方案是根本不进行比较:

      将布尔值与文字 truefalse 进行比较是荒谬的!

      改为:

      if(! e->start->explored || ! e->end->explored)
      

      【讨论】:

        【解决方案3】:

        您使用了赋值运算符 = 而不是比较运算符 ==。

        【讨论】:

          【解决方案4】:

          你在这里赋值:

          if((e->start->explored = false) || (e->end->explored = false)){
          

          应该是:

          if((e->start->explored == false) || (e->end->explored == false)){
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-05-26
            • 1970-01-01
            • 2018-04-01
            • 1970-01-01
            • 1970-01-01
            • 2018-07-13
            • 1970-01-01
            相关资源
            最近更新 更多