||, && операторы в 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' );
Другие вопросы по тегам