do-while循环不断重复

The do-while loop keeps on repeating

本文关键字:循环 do-while      更新时间:2023-10-16

>我有一个代码片段(我们在银行系统上分配了一个学校项目,这是第一个登录屏幕,也请注意,这个代码片段在main()函数内)像这样:

int choice;
do
{
    clrscr(); // for clear screen
    cout << "1. Help!" << endl;
    cout << "2. About Us..." << endl;
    cout << "3. Log In" << endl;
    cout << "4. Sign Up" << endl;
    cout << "Option: ";
    cin >> choice;
}while((choice != 1) || (choice != 2) || (choice != 3) || (choice != 4));

但问题是,无论我输入 1 还是 2、3 或 4 还是任何其他数字,循环都会不断重复,它只是忽略了选择的值......如果我没有错,那么一旦选择获得 1 或 2 或 3 或 4 的值,循环应该立即退出,如果它获得的值不是 1 或 2 或 3 或 4,循环应该继续......编译程序时没有错误,所以我无法了解实际问题是什么。

额外信息:-

操作系统: 视窗 7编译器:Visual C++ Express Edition(也在Borland Turbo C++ 4.5和Dev C++以及Code::Blocks最新版本中尝试过,但仍然是相同的问题)

循环条件将始终为真; choice不可能同时拥有所有这些值。

据推测,您打算使用&&,以便在choice具有任何这些值时循环终止。

简短回答:

choice不同于 1 或不同于 2、3 或 4 时,您重复此操作。如果 choice 的值正确,则由于其他 3 个条件,您将循环。

while((choice != 1) || (choice != 2) || (choice != 3) || (choice != 4));

你可能的意思是&&

while(choice != 1 && choice != 2 && choice != 3 && choice != 4);

或:

while(choice < 1 || choice > 4);

逻辑解释:

基本上,您希望在choice的值不正确时进行循环。在此上下文中,正确表示:choice == 1 || choice == 2 || choice == 3 || choice == 4

因此,第一个条件可能是:

while (!(choice == 1 || choice == 2 || choice == 3 || choice == 4));

如果你还记得那!(a || b) == (!a && !b).你也可以写:

while (choice != 1 && choice != 2 && choice != 3 && choice != 4);

这也是有道理的:循环而选择与 1 和 2 以及 3 和 4 不同。

您还可以确定 正确 表示:choice >= 1 && choice <= 4 。在这种情况下,您将拥有:

while (!(choice >= 1 && choice <= 4));

或者,使用相同的属性:

while (choice < 1 || choice > 4);

你已经告诉它,如果选择不是 1 或不是 2,就继续前进。您可能的意思不是 1 也不是 2,等等。

如果有人输入"做第一"之类的内容,你会遇到cin的麻烦,所以我建议你将代码更改为以下内容

# include <iostream>
#include <stdlib.h>
# include <string>
# include <sstream>
using namespace std;
int main ()
{
string choice="";
int num = 0;
 while (true) {
   system("cls"); // for clear screen
   cout << "1. Help!" << endl;
   cout << "2. About Us..." << endl;
   cout << "3. Log In" << endl;
   cout << "4. Sign Up" << endl;
   cout << "Option: ";
   getline(cin, choice);
   stringstream Stream(choice);
   if (Stream >> num)
     break;
   cout << "Invalid number, please try again" << endl;
 }
}