2012-04-22 4 views
1

Я, должно быть, что-то пропустил. Я делаю упражнение, чтобы узнать C++ и спрашивает, что если пользователь вводит либо с, р, т или г символы затем продолжать, в противном случае повторного запроса строку, поэтому я написал это:условное выражение во время цикла

#include <iostream> 
#include <cstring> 
#include <string> 

using namespace std; 

int main(void){ 
    cout << "Please enter one of the following choices:" << endl; 
    cout << "c) carnivore\t\t\tp) pianist\n"; 
    cout << "t) tree\t\t\t\tg) game\n"; 
    char ch; 
    do{ 
    cout << "Please enter a c, p, t, or g: "; 
    cin >> ch; 
    cout << "\"" << ch << "\"" << endl; 
    }while(ch != 'c' || ch != 'p' || ch != 't' || ch != 'g'); 

    cout << "End" << endl; 

    cin.clear(); 
    cin.ignore(); 
    cin.get(); 

    return 0; 
} 

Это делает не работает, и все, что я получаю, - это запрос, повторно запрашивающий его даже при нажатии любого из правильных символов.

Однако если изменить эту строку:

while(ch != 'c' || ch != 'p' || ch != 't' || ch != 'g'); 

к

while(ch != 'c' && ch != 'p' && ch != 't' && ch != 'g'); 

почему? Я понимаю, что оператор «OR» должен работать как один из тестов.

+1

The OR "рабочие" средства цикл вычисляет значение true, заставляя его снова зацикливаться. – chris

+0

Вы можете сконденсировать этот цикл, просто используя цикл while: http://www.parashift.com/c++-faq-lite/input-output.html#faq-15.3 – chris

ответ

6

Почему это так? Я понимаю, что оператор «OR» должен работать как один из тестов.

Точно. Всегда есть один из пройденных тестов. Символ будет либо не 'c', либо не 'p'. Это не может быть как 'c', так и 'p'. Таким образом, условие всегда верно, что приводит к бесконечному циклу.

Альтернативное условие с конъюнкциями работает, потому что оно ложно, как только ch равно одной из альтернатив: одно из неравенств является ложным, и, следовательно, все условие является ложным.

+1

Просто чтобы быть педантичным, персонаж может быть а не 'c', а не' p'. :-) Но суть вашего ответа правильная (т. Е. Если символ 'c', это по определению' not p'). – vanza

+0

@vanza: описание Р. Мартиньо Фернандес вовсе не противоречит вашим разъяснениям. По-английски проза 'или' не обязательно является исключительной; независимо от того, является ли оно исключительным, обычно определяется контекстом. Это одна из причин, по которой английский язык будет плохого языка программирования. –

3

Мое понимание состоит в том, что инструкция «ИЛИ» должна работать, поскольку один из тестов правильный.

Ну, вы могли бы использовать ||, но выражение должно было бы быть:

while(!(ch == 'c' || ch == 'p' || ch == 't' || ch == 'g')); 

Применяя De Morgan's law, выше упрощается:

while(ch != 'c' && ch != 'p' && ch != 't' && ch != 'g'); 
+1

Это DeMorgan, так заботясь о потребностях программистов во всем мире. – chris

Смежные вопросы