2011-03-09 146 views
1

我有一个关于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); 
    } 

天哪,我想我需要得到一些睡眠。这相当...愚蠢。 :)谢谢你家伙顺便说一句。

+5

''||手段“或”'!='表示“不等于”。大声读出代码给自己,我想你可能会看到问题。 – 2011-03-09 20:30:18

+0

那就是生活,接受一个答案并继续前进:) – Johan 2011-03-09 20:48:38

回答

8

表达式yn != 89 || yn != 12总是如此。任何值不等于89或不等于12。所以,这种表达方式没有实际意义。循环将永远循环,因为重复条件总是如此。

根据您的描述,您需要的条件是yn != 89 && yn != 12&&,而不是||

3

你的布尔逻辑是有点过:

while (yn != 89 && yn != 121) 

另一种方式来写这个,其可以是作为一个“阅读器”多个逻辑:

while (!(yn == 89 || yn == 121)) 
1

yn是89它是不是121;同样当yn是121时,它是而不是89;因此,条件总是满足。

也许你的意思,而yn不是非此即彼89121,这是措辞与

while(yn != 89 && yn != 121) 

或者你也可以说 “当yn既不是89121”:

while(!(yn == 89 || yn == 121)) 
3

替换||与& &。

原因是:

!(yn == 89 || yn == 121) < ==>yn != 89 && yn != 121(的DeMorgan)

0

(A || B)倒数是(!A && !B)(A && B)逆是(!A || !B)。你在构建原始循环时的思维过程是这样的:“我想yn == 89,所以我应该反转即循环yn != 89。”然后你决定改变它,“我想yn == 89 || yn == 121,所以我需要反转。”那就是你出错的地方:从我最初提交的表格中,你可以看到倒数(用作你的while条件)是yn != 89 && yn != 121。您只是简单地将||的原始简单反转扩展。

1

要扩大一点在其他答复 - 你永远不会达到你的第二个条件。第一个 “短路”

if (yn != 89

和立即停止。如果它不是89,我们就完成了。因为||(OR)是“如果其中任何一种情况”,我们不关心if之后的任何内容。当然,如果是89 ...那么它肯定不是121

你想while (yn != 89 && yn != 121)