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');

何故ですか?私の理解では、テストの1つが正しいので、「OR」ステートメントが機能するはずです。

4

2 に答える 2

6

何故ですか?私の理解では、テストの 1 つが正しいため、「OR」ステートメントが機能するはずです。

丁度。合格するテストは常に1 つです。文字は、 not'c'または not のいずれかになります'p''c'と の両方にすることはできません'p'。したがって、条件は常に真であり、無限ループにつながります。

ch接続詞を使用した代替条件は、代替条件の 1 つと等しくなるとすぐに偽になるため機能します。不等式の 1 つが偽であるため、条件全体が偽になります。

于 2012-04-22T19:43:27.517 に答える
3

私の理解では、テストの 1 つが正しいため、「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 に答える