2013-06-20 5 views
2
#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    string option; 
    cout << "Would like water, beer, or rum?--> "; 
    cin >> option; 
    while(option != "water" || option != "beer" || option != "rum") 
     { 
     cout << "You did not choose a valid option. Try again.\n"; 
     cout << "Would you like water, beer, or rum?-->"; 
     cin >> option; 
     } 
} 

Почему этот код никогда не выходит из цикла, даже если пользователь вводит правильный вариант?C++ while loop не работает

ответ

2

Ваш || s должен быть &&, так как a option может иметь только одно значение.

while (option != "water" && option != "beer" && option != "rum") 
{ 
    // ... 
} 
+0

@ user1816640 Нет проблем. – 0x499602D2

3

Вы используете неправильный логический оператор. Вы хотите, чтобы все ваших условий (option не равно воде, не равным пиву, а не равному рому), поэтому вы должны использовать и (&&). Или (||) означает, что выражение истинно, если любых условий являются истинными, и поскольку значения являются взаимоисключающими, это всегда будет иметь место, следовательно, ваш бесконечный цикл.

11

Прочитайте условие вслух - «запустить цикл, пока option не "water"илиoption не "beer"или ...».

Когда он должен остановиться?

1

Это утверждение всегда верно:

option != "water" || option != "beer" || option != "rum" 

Если option это «вода», то это не «пиво», так что утверждение верно. Если option это «пиво», это не «вода», так что утверждение верно (если у вас есть хорошее пиво, конечно.)

Я думаю, что вы имели в виду, чтобы написать

option != "water" && option != "beer" && option != "rum" 

Таким образом, как только option принимает любое из этих значений, цикл выйдет.

Надеюсь, это поможет!

0

Почти всегда != || последовательности неправильные и & & следует использовать. Если одно сравнение не выполняется, другие истинны, поэтому все условие всегда истинно. Если вы неравны к одному, вы, безусловно, неравны с другими.

С опытом вы будете видеть такую ​​конструкцию.

0

Вы можете использовать контейнер для хранения допустимых параметров и проверить, является ли выбор в контейнере:

set<string> validOptions = { "water", "beer", "rum"}; 

while(validOptions.count(option) == 0) { 
    // .. etc 
}