какая разница в использовании && и || в цикле do ... while? - PullRequest
1 голос
/ 15 марта 2009
#include<iostream>
using namespace std;

int main()
{

    char again;
    do
    {
        cout<<"you are in the while loop";
        cout<<"do you want to continue looping?";
        cin>>again;
    } while (again != 'n' || again != 'N');

    system("pause");
    return 0;
}

Я знаю, что что-то не так с условием проверки в 'while'. Но я не могу понять это.

когда ввод пользователя не является ни n, ни N, цикл должен продолжать печатать код "вы находитесь в цикле while" После нажатия «n» или «N» программа будет остановлена.

Однако для моего кода программа будет продолжать зацикливать код независимо от того, какой символ я ввожу. Но когда я меняю '||' до '&&', программа может запускаться по желанию. Кто-нибудь может сказать мне, что происходит?

Ответы [ 7 ]

10 голосов
/ 15 марта 2009

Да: || это "или" и && это "и".

Каждый символ либо"not 'n'" или "not 'N'", поскольку он не может быть одновременно 'n' и 'N' одновременно.

Другой (возможно, более простой для чтения) способ написания условия:

!(again == 'n' || again == 'N')

, что означает «противоположность (снова или 'n' или 'N')".

9 голосов
/ 15 марта 2009

Это булева алгебра, которая называется " Законы де Моргана ".

Not (P And Q) = (Not P) Or (Not Q)
Not (P Or Q) = (Not P) And (Not Q)

В вашем случае вы хотите, чтобы пользователи не вводили 'n' или 'N', это можно перевести на эту логику.

!(again == 'n' || again == 'N')

При применении законов де Моргана это будет

(again != 'n' && again != 'N')

Для получения дополнительной информации вы можете прочитать Логика предложения

9 голосов
/ 15 марта 2009

Это распространенный вопрос логической логики. || означает «или», что означает «пока одна сторона этого истинна, тогда выражение истинно». Поэтому, когда вы передаете верхний регистр 'N' в c != 'n' || c != 'N', программа говорит: «Хорошо, 'N' не равно 'n', поэтому одна сторона выражения является истинной, поэтому все выражение истинно и в этом нет необходимости. проверить остальное выражение. " Даже когда вы нажимаете строчную 'n', программа говорит: «Хорошо, 'n' равно 'n', но не равно 'N', поэтому одна сторона выражения является истинной, поэтому все выражение является истинным. " Это то, что происходит в вашем цикле while.

С другой стороны, && означает «и», что означает «обе стороны выражения должны быть истинными»; когда вы передаете 'N' в верхний регистр c != 'n' && c != 'N', программа думает, что "'N' не равно 'n', но равно 'N', поэтому истинной является только одна сторона выражения, поэтому выражение ложь ".

Это сбивает с толку, потому что если бы вы тестировали, чтобы увидеть, были ли введенные символы равны определенным значениям, вы бы использовали || (например, "Я хочу знать, если 'a' или 'b' или 'c' введено ").

Как правило, когда вы используете || для определенного выражения и хотите получить противоположное этому выражению, вам нужно изменить на && (например, я не хочу ничего из 'a', 'b' или 'c'; или, иначе говоря, значение не может быть 'a' и , оно не может быть 'b', и , оно не может быть 'c' "). Аналогично, если вы бы использовали && для определенного выражения, и вы хотите использовать противоположное этому выражению, тогда вам нужно будет использовать ||. Это один из законов Де Моргана, который я бы рекомендовал вам прочитать, чтобы вы могли избежать необходимости заново откройте каждого из них самостоятельно.

5 голосов
/ 15 марта 2009

Хотя оригинальный постер теперь счастлив, я не видел этого в других ответах:

(true  && true ) == true
(true  && false) == false
(false && true ) == false
(false && false) == false

(true  || true ) == true
(true  || false) == true
(false || true ) == true
(false || false) == false

!true  == false
!false == true

Вот и все!

2 голосов
/ 04 февраля 2013

Я хорошо понимаю вашу проблему, и вот объяснение:

Цикл do-while является циклом условия выхода. Это означает, что тело цикла всегда выполняется первым. Затем оценивается условие теста. Если условие проверки TRUE, программа снова выполняет тело цикла. Если условие проверки FALSE, цикл завершается, и выполнение программы продолжается с оператором, следующим после while.

в вашем коде, когда вы нажимаете «n» или «N», ваше условие проверки всегда будет одно истинное и одно ложное, поэтому, когда вы используете || вы будете удовлетворять условию теста (true || false = true), поэтому программа снова выполнит тело цикла. но когда вы используете &&, это даст (true && false = false), условие теста больше не определяется, поэтому программа не выполнит тело цикла снова.

Надеюсь, это полезно ..... наслаждайтесь программированием! Ameraradi

1 голос
/ 15 марта 2009

&& - это логическое И. || является логическим ИЛИ.

(также, & - побитовое И, и | - побитовое ИЛИ.)

0 голосов
/ 15 марта 2009

вы можете попробовать, пока (! (Снова == 'n' || снова == 'N'))

...