Вопрос - PullRequest
       16

Вопрос

3 голосов
/ 24 мая 2011
do 
{
  cout << "Car is coming ... " << "[P]ay or [N]ot?" << endl;
  ch=getch();
} while ( ch !='q' || ch != 'Q');

Почему код сверху не будет работать, а код ниже? Я пытался сделать это с круглыми скобками вокруг каждого оператора различными способами, и компилятор каждый раз выдавал ошибку, пока я не перегруппировал их, как я сделал ниже. Мне просто интересно, почему это так.

do 
{
  cout << "Car is coming ... " << "[P]ay or [N]ot?" << endl;
  ch=getch();
} while ( !(ch=='q' || ch=='Q') );

Я использую Visual Studio 2008 в качестве моего компилятора; архитектура x86.

Ответы [ 7 ]

16 голосов
/ 24 мая 2011

Изучите законы де Моргана

(не A) или (не B)

не совпадает с

не (A или B).

3 голосов
/ 24 мая 2011

(ch != 'q' || ch != 'Q') всегда верно: «ch не равно 'q' или ch не равно 'Q'».

2 голосов
/ 24 мая 2011

Проблема в том, что ваша логическая логика отключена и два условия while не совпадают.

  • Вверху: символ не 'q' или не 'Q'
  • Внизу: символ не является ('q' или 'Q')

Вершина вернет true для каждого возможного символа. Нижняя часть вернет true для каждого символа, кроме 'q' и 'Q'

0 голосов
/ 24 мая 2011

Обращая всю свою логику, используя '!', Вы поступили правильно, изменив условные операторы "==" на "! =", Но забыли поменять местами логические операторы "||" на "&&". Таким образом, это должно быть правильно:

while (ch!='q' && ch!='Q');

Я использую C #, поэтому, хотя приведенный выше код будет работать, я бы использовал это вместо этого, так как его легче читать:

while (ch.ToUpper() != 'Q');
0 голосов
/ 24 мая 2011

У вас есть логика в обратном направлении, это мое отрицание, это работает. По законам Демиргана, !(ch == 'Q' || ch == 'q') совпадает с ch != 'Q' && ch != 'q'.

Так как если a не может быть одновременно и little q, и big Q, то while (ch != 'Q' || ch != 'q') не имеет смысла, потому что если это 'Q', то это не будет 'q', и наоборот .

0 голосов
/ 24 мая 2011

!(ch=='q' || ch=='Q') эквивалентно ch!='q' && ch!='Q'.См. Также законы де Моргана .

0 голосов
/ 24 мая 2011

Я думаю, вы хотите это в своем первом примере:

ch !='q' && ch != 'Q'

Вы хотите, чтобы ввод был не q И не Q.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...