2012-04-29 64 views
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"; 

...,当然,它印的屏幕 “FAIL”。我的逻辑错误是什么?

回答

8

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

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

相反的值进行对比,false的,它更清晰使用!不是操盘手。内括号也被删除:

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

哦!我确定!哎呀。 – nicole

2

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

2

您正在分配值在这里:

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

应该是:

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

正如其他人阐述了你,而不是比较小心使用分配。然而,真正的解决方案根本不是比较:

比较布尔值与文字truefalse是无意义的!

你应该写:

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