C - пока (что-то || что-то) - PullRequest
       1

C - пока (что-то || что-то)

1 голос
/ 09 марта 2011

У меня быстрый вопрос о цикле 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);
    }

Черт возьми, я думаю, мне нужно немного поспать.Это было довольно ... глупо.:) Спасибо, ребята, кстати.

Ответы [ 6 ]

8 голосов
/ 09 марта 2011

Выражение yn != 89 || yn != 12 всегда верно. Любое значение либо не равно 89, либо не равно 12. Итак, это выражение не имеет практического смысла. Цикл будет повторяться бесконечно, поскольку условие повторения всегда выполняется.

Согласно вашему описанию, вам необходимо условие yn != 89 && yn != 12. &&, а не ||.

3 голосов
/ 09 марта 2011

Заменить || с &&.

Причина:

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

3 голосов
/ 09 марта 2011

Ваша логическая логика немного отключена:

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

Другой способ написать это, который может быть более логичным для «читателя»:

while (!(yn == 89 || yn == 121))
1 голос
/ 09 марта 2011

Чтобы немного расширить другие ответы, вы никогда не доберетесь до своего второго условия. Первые «короткие замыкания»

if (yn != 89

И остановись прямо там. Если это не 89, мы сделали. Мы не заботимся о чем-либо после этого в if, потому что || (ИЛИ) - «Если это так». И, конечно, если это 89 ... тогда это точно не 121.

Вы хотите while (yn != 89 && yn != 121)

1 голос
/ 09 марта 2011

Когда yn равно 89, это , а не 121;аналогично, когда yn равен 121, это , а не 89;таким образом, условие всегда выполняется.

Возможно, вы имеете в виду, в то время как yn не является либо 89, либо 121, то есть с и :

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

или, альтернативно, вы можете сказать «когда yn не является ни 89, ни 121»:

while( !(yn == 89 || yn == 121) )
0 голосов
/ 09 марта 2011

Инверсия (A || B) равна (!A && !B), а инверсия (A && B) равна (!A || !B). Ваш мыслительный процесс при создании исходного цикла был чем-то вроде: «Я хочу yn == 89, поэтому я должен инвертировать , чтобы сделать цикл , а yn != 89». Затем вы решили изменить его на «Я хочу yn == 89 || yn == 121, поэтому мне нужно инвертировать это». Вот где вы ошиблись: из форм, которые я представил изначально, вы можете увидеть обратное (для использования в качестве условия while): yn != 89 && yn != 121. Вы просто ненадлежащим образом расширили свою оригинальную простую инверсию ||.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...