||的逻辑错误运营商?

时间:2012-04-29 17:35:48

标签: c++ logical-operators

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

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"; 

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

4 个答案:

答案 0 :(得分:8)

您正在为您的媒体资源分配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";
}

答案 1 :(得分:6)

正如其他人所说,你不小心使用了作业而不是比较。但是,真正的解决方案根本不是比较:

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

相反,写一下:

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

您在此处指定值:

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

应该是:

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