1

我肯定错过了什么。我正在做一个学习 c++ 的练习,它询问用户是否输入 c、p、t 或 g 字符然后继续,否则重新请求提示,所以我写了这个:

#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”语句应该起作用,因为其中一项测试是正确的。

4

2 回答 2

6

这是为什么?我的理解是“OR”语句应该起作用,因为其中一项测试是正确的。

确切地。总有一项测试通过。一个字符要么不是'c',要么不是'p'。不能同时是'c''p'。所以条件总是为真,导致无限循环。

带有连词的替代条件有效,因为一旦ch等于其中一个替代条件,它就为假:其中一个不等式为假,因此整个条件为假。

于 2012-04-22T19:43:27.517 回答
3

我的理解是“OR”语句应该起作用,因为其中一项测试是正确的。

好吧,您可以使用||,但表达式必须是:

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

通过应用德摩根定律,上述简化为:

while(ch != 'c' && ch != 'p' && ch != 't' && ch != 'g');
于 2012-04-22T19:44:17.217 回答