0

私のプログラムの一部 (必要に応じて詳細を追加できます) には、次の行が含まれています。

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

これはグラフ アルゴリズムの一部であり、e は "開始" と "終了" の頂点を持つ有向エッジです。e のインシデント頂点の少なくとも 1 つが探索されていない場合に「アクション」が発生することを望みますが、このロジックには誤りがあるようです。小さな例を使用して、実際にエッジの開始頂点と終了頂点が最初から探索されていないことを確認しましたが、関数全体が無限ループに陥っています。

それで、私は次のようにテストしました:

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

  else cout << "FAIL"; 

...そしてもちろん、「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

他の人が説明したように、比較の代わりに誤って代入を使用しました。ただし、実際の解決策は、まったく比較しないことです。

ブール値をリテラルtrueと比較することfalseは無意味です!

代わりに、次のように記述します。

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 に答える