如何跳出这个Do-While循环?

3
我有一个基本的Arduino代码,我希望有两个选项可以退出这个Do-While循环。我简化了原始代码,以突出真正的问题:Do-While无法识别OR ||条件来退出循环。
在这段代码中,我从两个整数变量开始,它们都等于零。一旦它们进入Do-While循环,它们将立即被设置为2,以便它们可以在第一次迭代中立即退出Do-While。
以下是我的代码:
int fin = 0;
int ending = 0;
int counter = 0;


void setup() {

  Serial.begin(9600);

}; //void setup



void loop ()  {

  do  {

      Serial.println("We are IN Do-While #1");
      ending = 2;
      //fin = 2;

  } while ((ending < 1) || (fin < 1)); //I have just one condition for exit the Do-While ending = 1


Serial.println("We are OUT Do-While #1");
delay(3000);


  do {

    counter++;
  } while(counter<=100);

  Serial.println("We are OUT Do-While #2");
delay(3000);

  }

我的问题在于我没有设置fin = 2因为我想测试OR条件是否有效。但是似乎不能退出Do-While循环,除非它们都等于2。这让我感到奇怪,因为OR条件允许使用双选项退出Do-While,在这种特殊情况下,这些选项是:ending<1 OR (替代选项)..fin<1。此外,如果我改变(其余的代码不变)While条件为AND,它会像我想要的那样行事:因此我有两种方法退出Do-While循环。就像这样:
} while ((ending < 1) && (fin < 1));

但是在AND条件中,我必须匹配ending >= 1和(同时)fin >= 1的两个条件才能退出循环,难道不是吗?

为什么会发生这种情况?如何解决?


建议:减少循环体中条件测试的数量,只保留必要的测试。可以在循环体中进行赋值,但不建议这样做(以防程序员错误)。通常情况下,重构测试以发现强制退出循环的条件。这是您应该针对测试的条件。 - C. R. Ward
4个回答

6
记住,如果你写 while (condition),那么只要 condition 为真,就会循环执行。因此,由于你的条件是
(ending < 1) || (fin < 1)

这个语句的错误情况是当 ending < 1fin < 1 都为假时。如果你在这种情况下混淆了,一个简单的技巧是使用 德摩根定律 来找到逆命题。换句话说,如果你想要在 (ending < 1) || (fin < 1) 循环,那么就意味着你想要在相反的条件下停止循环。使用德摩根定律,我们可以得到:
!((ending < 1) || (fin < 1))
!(ending < 1) && !(fin < 1)
ending >= 1 && fin >= 1

所以只有当 ending >= 1 && fin >= 1 时,我们才会停止循环!如果你想在 ending >= 1 || fin >= 1 时停止循环,那么我们将在相反的情况下循环。再次使用 DeMorgan 定律进行推导...
!(ending >= 1 || fin >= 1)
!(ending >= 1) && !(fin >= 1)
ending < 1 && fin < 1

原文意思是“所以你一直想要的是AND而不是OR!”

4

但似乎除非它们都等于2,否则无法退出Do-While。对我来说这很奇怪,因为OR条件允许用双重选项退出Do-While,在这种特殊情况下,这些选项是:

实际上,恰恰相反。

循环有两个选项可以继续执行

我相信你的意思是&&而不是||

但在AND条件下,不需要匹配结束> = 1和fin> = 1的两个条件吗?

是的,才能继续。

这意味着,您只需要匹配其中之一即可停止。


2

在当前状态下,只要(至少)有一个条件为真(不一定是两个都为真!),循环就会继续。

只要ending小于2 或者 fin小于2,循环就会继续。在你的代码中,fin小于2,所以循环继续...


2

现在我们讨论的是代码中的第一个循环。

  do  {

  Serial.println("We are IN Do-While #1");
  ending = 2;
  //fin = 2;
} while ((ending < 1) || (fin < 1));

如果您不改变“fin”变量,它将保持不变,退出条件将无法实现,导致循环无法结束。

您可以在循环中使用if条件语句,

  do  {

  Serial.println("We are IN Do-While #1");
  ending = 2;
  //fin = 2;
    if ( ending >= 1 ) break;
  }

或者像你提到的那样,使用||运算符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接