||的逻辑错误 运营商?

nic*_*ole 0 c++ logical-operators

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

if((e->start->explored = false) || (e->end->explored = false)){
   //do action...
 } 
Run Code Online (Sandbox Code Playgroud)

这是图算法的一部分,其中e是具有入射顶点"开始"和"结束"的有向边.如果e的事件顶点中至少有一个未被探索,我希望"动作"发生,但这种逻辑似乎是错误的.虽然我使用了一个小例子并且确认了我的边缘的开始和结束顶点确实未开始,但是我的整体函数进入了一个无限循环.

那么我测试它是这样的:

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

  else cout << "FAIL"; 
Run Code Online (Sandbox Code Playgroud)

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

Boj*_*les 8

您正在分配false属性而不是对其进行测试false.这是经常犯的错误,很难调试.将=赋值运算符更改为相等运算符==:

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

不是将值进行比较false,而是使用!not运算符更清楚.内支架也被废除了:

if(!e->start->explored || !e->end->explored) {
    // Do action...
} else {
    cout << "FAIL";
}
Run Code Online (Sandbox Code Playgroud)


Kon*_*lph 6

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

将bool值与文字进行比较true并且false是荒谬的!

相反,写:

if(! e->start->explored || ! e->end->explored)
Run Code Online (Sandbox Code Playgroud)