В чем разница в использовании && и || В The Do ... пока петля?

StackOverflow https://stackoverflow.com/questions/647413

  •  22-07-2019
  •  | 
  •  

Вопрос

#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;
}

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

Да: || является "или" и & amp; & amp; is ".

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

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

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

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

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

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')

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

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

(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

Это все!

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

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

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

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

&& — это логическое И.|| логичный или.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top