我有一个关于while循环的快速提问。
我想读取ASCII字符代码,如果它不是某些特定的ascii代码,我不想继续并要求用户再次输入。
这有效
while (yn != 89)
{
printf("\nEnter");
flushall();
scanf("\n%c", &yn);
}
这不是
while (yn != 89 || yn != 121)
{
printf("\nEnter");
flushall();
scanf("\n%c", &yn);
}
天哪,我想我需要睡个好觉。这相当......愚蠢。 :)谢谢大家BTW。
答案 0 :(得分:8)
表达式yn != 89 || yn != 12
始终为真。任何值都不等于89
或不等于12
。所以,这个表达没有任何实际意义。循环将永远循环,因为重复条件始终为真。
根据您的描述,您需要的条件是yn != 89 && yn != 12
。 &&
,而非||
。
答案 1 :(得分:3)
您的布尔逻辑有点偏离:
while (yn != 89 && yn != 121)
写这个的另一种方式,作为“读者”可能更合乎逻辑:
while (!(yn == 89 || yn == 121))
答案 2 :(得分:3)
替换||与&&。
原因:
!(yn == 89 || yn == 121)
< ==> yn != 89 && yn != 121
(德摩根)
答案 3 :(得分:1)
当yn
为89时,不 121
;类似地,当yn
为121时,不 89;因此,条件总是得到满足。
也许您的意思是yn
不是89
或121
,而是用和表示:
while(yn != 89 && yn != 121)
或者您也可以说“当yn
不是89
或121
时”:
while( !(yn == 89 || yn == 121) )
答案 4 :(得分:1)
要在其他回复中稍微扩展一下 - 你永远不会达到第二个条件。第一个“短路”
if (yn != 89
然后停在那里。如果它不是89,我们就完成了。在if
之后我们不关心任何事情因为||
(OR)是“如果其中任何一个是这种情况”。当然,如果它是89 ...那么肯定不是121.
您想要while (yn != 89 && yn != 121)
答案 5 :(得分:0)
(A || B)
的倒数为(!A && !B)
,(A && B)
的倒数为(!A || !B)
。你构建原始循环的思维过程就像是“我想要yn == 89
,所以我应该反转,以便在 yn != 89
时循环。”然后你决定把它更改为“我想要yn == 89 || yn == 121
,所以我需要反转它。”这就是你出错的地方:从我最初提供的表格中你可以看到反向(用作你的时间条件)是yn != 89 && yn != 121
。您只是不恰当地使用||
扩展原始的简单反转。