C - while(东西|| something)

时间:2011-03-09 20:28:13

标签: c

我有一个关于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。

6 个答案:

答案 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不是89121,而是用表示:

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

或者您也可以说“当yn不是89121时”:

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。您只是不恰当地使用||扩展原始的简单反转。