我有这个基本的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这两个条件才能退出循环吗?
为什么会这样?而我该如何解决呢?
但是,除非它们都等于2,否则似乎无法退出Do-While。这对我来说很奇怪,因为OR条件允许使用双选项退出Do-While,在这种情况下,选项是:
实际上是相反的。
循环具有继续前进的两个选项。
我确定您的意思是&&
,而不是||
。
但是不是在AND条件下,我必须同时匹配两个结束条件> = 1 AND(同时)fin> = 1吗?
是,继续。
这意味着,您只需不匹配其中的一个即可停止。
请记住,如果您说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 OR fin小于2,则循环将继续。在您的代码中,fin小于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;
}
或仅使用||就像你提到的那样。