0

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

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

4 回答 4

8

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

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

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

if(!e->start->explored || !e->end->explored) {
    // Do action...
} else {
    cout << "FAIL";
}
于 2012-04-29T17:36:57.037 回答
6

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

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

相反,写:

if(! e->start->explored || ! e->end->explored)
于 2012-04-29T17:38:26.380 回答
2

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

于 2012-04-29T17:37:06.600 回答
2

您在此处分配值:

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

应该:

if((e->start->explored == false) || (e->end->explored == false)){
于 2012-04-29T17:37:26.303 回答