2016-12-27 5 views
3

Почему этот код работает только с оператором &&?||, && операторов в C

Я думаю, что это должно быть ||, но я ошибаюсь. Choice не может быть равно 2 значения в одно и то же время?

Мне нужно спросить пользовательский ввод, пока выбор не будет равен 'a' ИЛИ 'd', но почему мне нужно написать &&? Я не понимаю.

do 
{ 
    scanf("%c", &choice); 
} while (choice != 'a' && choice != 'd'); 

Я хотел использовать ||, но это не работает.

+2

Проверить законы _DeMorgan_ [здесь] (https://simple.wikipedia.org/wiki/Boolean_algebra). – CristiFati

ответ

6

Нет ничего плохого в том, что как работают, вам нужно получить логику для кода здесь.

Во-первых, цикл do...while работает до тех пор, пока условие в while имеет значение ИСТИНА.

В вашем случае вы хотите спросить вход пользователя до тех пор, пока выбор не будет равен 'a' ИЛИ 'd'.

  • Так, по-другому, если пользовательский ввод не равен a и d, вам нужно петля.

  • Логически, если вход не равен a, он может еще быть равен d, так что вы должны проверить, как дела там. Только когда нет из a или d - это вход, вы продолжаете цикл.

Помните, что вы не проверяет равенство, вы проверяете неравноправие. Только если оба неравенства выполнены, то только условие while оценивает значение TRUE_, и вы продолжаете цикл, чтобы запросить новые значения.

Вкратце, read DeMorgan's laws.

+1

Ключевой момент: «Только если выполняются оба неравенства». – Yellowfun

5

Вы можете использовать ||. Вы должны изменить условное выражение while петли следующим образом

while (!(choice == 'a' || choice == 'd')); 

Это просто применение DeMorgan's Law, как не влияет на И & ИЛИ

______ ___ ___ 
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 
4

Вы можете заменить условие с этим:

while (!(choice == 'a' || choice == 'd')); 

Используя это условие do-while заявление будет выполняться до тех пор выбор не равен «а» или «D».

+0

Это работает только так: while (! (Choice == 'a' || choice == 'd')); – Yellowfun

+0

Ваше состояние равно моему. Что не так? –

+0

нужна другая пара круглых скобок – Yellowfun

3

эй это не сработает, потому что вы хотите, чтобы он не был равен а и 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) 

Здесь я применил просто это.

3

Если вы тусклый использовать или (||) оператора, вы должны применить De Morgan's law:

Скажем, и Ь булевы, поэтому

a || b <=> !a && !b 

a && b <=> !a || !b 

Это

while (choice != 'a' && choice != 'd'); 

такой же, как

while !(choice == 'a' || choice == 'd'); 
5

Мне нужно задать ввод пользователя, пока выбор не будет равен «а» ИЛИ «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'); 
+0

Спасибо Влад приятное объяснение! Кажется, я понял. – Yellowfun

+0

@Yellowfun Нет вообще. Добро пожаловать.:) –