||, && операторы в C
Почему этот код работает только с &&
оператор?
Я думаю, что это должно быть ||
, но я ошибаюсь. Choice
не может быть равно 2 значению одновременно?
Мне нужно спросить ввод пользователя, пока выбор не будет равен 'a'
ИЛИ ЖЕ 'd'
но зачем мне писать &&
? Я не понимаю
do
{
scanf("%c", &choice);
} while ( choice != 'a' && choice != 'd' );
Я хотел использовать ||
, но это не работает.
6 ответов
Нет ничего плохого в том, как работают операторы, вам нужно получить логику для кода здесь.
Первый do...while
цикл работает до тех пор, пока условие в while
правда.
В вашем случае вы хотите запросить ввод пользователя, пока выбор не будет равен 'a'
ИЛИ ЖЕ 'd'
,
Так, иначе, пока пользовательский ввод не равен
a
а такжеd
нужно зациклить.Логично, если вход не равен
a
, он все еще может быть равенd
так что вы должны проверить оба случая там. Только когда ни один изa
или жеd
это вход, вы продолжаете цикл.
Помните, вы проверяете не равенство, а неравенство. Только если оба неравенства выполнены, то только while
условие оценивается как TRUE_, и вы продолжаете цикл, чтобы запросить новые значения.
В двух словах, читайте законы Деморгана.
Ты можешь использовать ||
, Вам нужно изменить while
цикл условного выражения следующим образом
while ( !(choice == 'a' || choice == 'd') );
Это просто применение закона Деморгана, как не влияет на И и ИЛИ
______ ___ ___
A || B = A && B
______ ___ ___
A && B = A || B
Запомните это как: "Разорви линию, поменяй знак".
INPUT OUTPUT 1 OUTPUT 2
A B NOT (A OR B) (NOT A) AND (NOT B)
0 0 1 1
0 1 0 0
1 0 0 0
1 1 0 0
INPUT OUTPUT 1 OUTPUT 2
A B NOT (A AND B) (NOT A) OR (NOT B)
0 0 1 1
0 1 1 1
1 0 1 1
1 1 0 0
Мне нужно спрашивать ввод пользователя, пока выбор не будет равен 'a' ИЛИ 'd'
Это условие можно записать как
choice == 'a' || choice == 'd'
Поэтому, если вы хотите, чтобы цикл повторялся до тех пор, пока это условие не станет истинным, вы должны написать
do
{
//...
} while ( !( choice == 'a' || choice == 'd' ) );
Или если включить заголовок
#include <iso646.h>
тогда вы можете написать
do
{
//...
} while ( not ( choice == 'a' || choice == 'd' ) );
или даже как
do
{
//...
} while ( not ( choice == 'a' or choice == 'd' ) );
Состояние
!( choice == 'a' || choice == 'd' )
или же
not ( choice == 'a' or choice == 'd' )
эквивалентно
!( choice == 'a' ) && !( choice == 'd' )
или же
not ( choice == 'a' ) and not ( choice == 'd' )
что в свою очередь эквивалентно
( choice != 'a' ) && ( choice != 'd' )
Скобки могут быть опущены. Таким образом, вы будете иметь
do
{
//...
} while ( choice != 'a' && choice != 'd' );
Вы можете заменить условие следующим:
while (!(choice == 'a' || choice == 'd'));
Используя это условие do-while
оператор будет выполняться до тех пор, пока выбор не станет равен "a" или "d".
Эй, это не сработает, потому что вы хотите, чтобы оно не было равно a и b.
not equal to a and not equal to b
so it will be !( eqaul to a or eqaul to b) (De morgan's)
Закон де Моргана гласит
not( a and b) = not (a) or not(b)
Здесь я применил просто это.
Если вы хотите использовать или (||
), вы должны применить закон де Моргана:
Допустим, a, и b являются логическими значениями, поэтому
a || b <=> !a && !b
a && b <=> !a || !b
Это,
while ( choice != 'a' && choice != 'd' );
такой же как
while !( choice == 'a' || choice == 'd' );