-2

私の CS の本で、ソース コードが次のような C++ プログラムを見ました。

#include <iostream>
using namespace std;
 
int main()
{
  char choice=‘y’; //why is this required?
  int marks, classx, test;
 
  while (choice=='y'||choice==‘Y') {
    cout<<"Enter marks:";
    cin>>marks;
    cout<<"\nEnter class:";
    cin>>classx;
    cout<<"\nWant to Enter more? (y/n)";
    cin>>choice; //Can't understand why **choice** is assigned **'y'** before while loop?
  }
  return 0;
}

このコードでは、ループの'y'前に文字を割り当てた理由がわかりません。5 行目でwhich assignswhileの値を省略しましたが、その後はエラーが表示されなくても実行されません!choice'y'

ループの前'y'に文字を割り当てた理由を説明してください。choicewhile

私はプログラミングの世界の初心者であり、C ++から始めたことに注意してください

4

8 に答える 8

3

while ループの最初の条件は ifchoice=='y'であるため、最初の選択で 'y' と等しくない場合、最初からループに入ることさえありません。

最初に初期化したくない場合はchoice、代わりに while ループを do~while に変更します。

do
{
     cout<<"Enter marks:";
     cin>>marks;
         cout<<"\nEnter class:";
      cin>>classx;
          cout<<"\nWant to Enter more? (y/n)";
      cin>>choice; //Can't understand why **choice** is assigned **'y'** before while loop?

} while (choice=='y'||choice==‘Y');

この場合、do条件なしでループが開始され、最初のループが常に発生します。whileループの最後で、条件が trueの場合にのみ再度ループします。

于 2013-07-31T17:56:52.340 に答える
1

そうしないと、 またはのchoiceどちらにも等しくない可能性のあるガベージ値があり、最初のループ条件は false になります。で初期化すると、初回のループが確実に実行されます (またはで初期化すると、コードの動作が明確に定義されている = 常に初めて実行されます)。'y''Y'ychoice'y''Y'

ユーザーに初めて選択肢を入力させたい場合は、cinループの前に追加します。

// here you may leave choice uninitialized, know behavior is defined 
cout<< "\nWant to Enter more? (y/n)";
cin>> choice; 
while (choice == 'y' || choice == 'Y'){
     cout<< "Enter marks:";
     cin>> marks;
     cout<< "\nEnter class:";
     cin>> classx;

     cout<< "\nWant to Enter more? (y/n)";
     cin>> choice; 
}

注意:ガベージ値は未定義の動作を引き起こします。
さらに、コード内の変数をデフォルト値で初期化することは常に実践されています。

于 2013-07-31T17:56:06.830 に答える
1

あなたが尋ねた

しかし、なぜ "choice" の初期値として "y" (つまり、while ループの条件値) だけを使用したのでしょうか。

while ループwhile (choice=='y'||choice==‘Y')は || で 2 つの条件を指定します。(論理 OR 演算子) それらの間。つまり、どちらの条件が真でも、while ループが実行されます。

ループが最初に実行されるように、choice を初期値に設定する必要がありました。その初期値は 'Y' または 'y' のいずれかである可能性があり、それらのいずれでも、while ループを最初に実行することができます。

于 2013-07-31T18:08:18.707 に答える
1

choice = 'y'whileループ内のコードが少なくとも 1 回実行されていることを確認してください。それ以外の場合、プラットフォーム/コンパイラに応じて、ループが 1 回実行されるか、まったく実行されない場合があります。

また、デバッガーを使用すると、いくつかの質問にすばやく答えることができます。

于 2013-07-31T18:00:35.433 に答える
1

ここで必要なのは、ループの構築方法だけです。while

ループ条件に注意してください。

while (choice=='y'||choice==‘Y')

choiceが に設定されていない場合、yまたはが最初に実行されるY前にwhile、条件が満たされることはなく、ループが開始されることはありません。

デバッガーで自分で試してみてください。

于 2013-07-31T17:57:22.230 に答える
1

値は最初に割り当てられます。これは、その後で初めてループまたは条件に入るからです。

while (choice=='y'||choice==‘Y')

失敗します。したがって、選択変数が初期化されます

于 2013-07-31T17:57:41.857 に答える
0

値を割り当てないと、不確定な値になり、またはwhile(choice == 'y' || choice == 'Y')ではない値が表示されるため、最初はループに入らず、ユーザーは何も入力できません。yY

ところで、コード内で逆引用符 (`) と単一引用符 (') を混在させていると、コンパイラはそれを受け入れません。一重引用符のみを使用してください。

于 2013-07-31T17:56:57.087 に答える