C - 虽然(东西||东西)
我有一个关于while循环的快速问题。C - 虽然(东西||东西)
我想读取ASCII字符码,如果它不是一些特定的ASCII码,我不想继续并要求用户再次输入。
这工作
while (yn != 89)
{
printf("\nEnter");
flushall();
scanf("\n%c", &yn);
}
这不
while (yn != 89 || yn != 121)
{
printf("\nEnter");
flushall();
scanf("\n%c", &yn);
}
天哪,我想我需要得到一些睡眠。这相当...愚蠢。 :)谢谢你家伙顺便说一句。
表达式yn != 89 || yn != 12
总是如此。任何值不等于89
或不等于12
。所以,这种表达方式没有实际意义。循环将永远循环,因为重复条件总是如此。
根据您的描述,您需要的条件是yn != 89 && yn != 12
。 &&
,而不是||
。
你的布尔逻辑是有点过:
while (yn != 89 && yn != 121)
另一种方式来写这个,其可以是作为一个“阅读器”多个逻辑:
while (!(yn == 89 || yn == 121))
当yn
是89它是不是121
;同样当yn
是121时,它是而不是89;因此,条件总是满足。
也许你的意思,而yn
不是非此即彼89
或121
,这是措辞与和:
while(yn != 89 && yn != 121)
或者你也可以说 “当yn
既不是89
或121
”:
while(!(yn == 89 || yn == 121))
替换||与& &。
原因是:
!(yn == 89 || yn == 121)
< ==>yn != 89 && yn != 121
(的DeMorgan)
的(A || B)
倒数是(!A && !B)
和(A && B)
逆是(!A || !B)
。你在构建原始循环时的思维过程是这样的:“我想yn == 89
,所以我应该反转即循环而yn != 89
。”然后你决定改变它,“我想yn == 89 || yn == 121
,所以我需要反转。”那就是你出错的地方:从我最初提交的表格中,你可以看到倒数(用作你的while条件)是yn != 89 && yn != 121
。您只是简单地将||
的原始简单反转扩展。
要扩大一点在其他答复 - 你永远不会达到你的第二个条件。第一个 “短路”
if (yn != 89
和立即停止。如果它不是89,我们就完成了。因为||
(OR)是“如果其中任何一种情况”,我们不关心if
之后的任何内容。当然,如果是89 ...那么它肯定不是121
你想while (yn != 89 && yn != 121)
''||手段“或”'!='表示“不等于”。大声读出代码给自己,我想你可能会看到问题。 – 2011-03-09 20:30:18
那就是生活,接受一个答案并继续前进:) – Johan 2011-03-09 20:48:38