2012-04-29 109 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)