如何摆脱此Do-While循环?

问题描述 投票:3回答:4

我有这个基本的Arduino代码,我想拥有2个选项以退出此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条件是否正常工作

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

ending <1或(替代选项)。fin <1

另外,如果我更改(代码的其余部分相同),则使用AND的while条件的行为类似于我想要的:因此,我有两种方法可以退出Do-While循环。像这样:

} while ((ending < 1) && (fin < 1));

但是不是在AND条件下我必须同时匹配end> = 1和AND(同时)fin> = 1这两个条件才能退出循环吗?

为什么会这样?而我该如何解决呢?

c++ arduino do-while
4个回答
4
投票

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

实际上是相反的。

循环具有继续前进的两个选项。

我确定您的意思是&&,而不是||

但是不是在AND条件下,我必须同时匹配两个结束条件> = 1 AND(同时)fin> = 1吗?

是,继续。

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


5
投票

请记住,如果您说while (condition),则将循环只要condition的值为真。因此,由于您的条件是

(ending < 1) || (fin < 1)

唯一使它为假的方法是如果两个ending < 1都为假AND fin < 1也为假。

当您像这样混乱时,一个简单的技巧就是使用DeMorgan's Law查找对立的事物。换句话说,如果您想在(ending < 1) || (fin < 1)时循环播放,这与说要在相反情况为TRUE时停止循环播放相同。使用德摩根定律,我们可以看到这是:

!((ending < 1) || (fin < 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)
ending < 1 && fin < 1

所以您一直想要一个AND而不是OR!


2
投票

在您当前的状态下,只要(至少)其中一个条件为真(就不必同时为两个!),循环就会继续进行。

只要结尾小于2 OR 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;
  }

或仅使用||就像你提到的那样。

© www.soinside.com 2019 - 2024. All rights reserved.