即使条件不为真,while循环也会运行

时间:2019-07-02 14:49:46

标签: c++

我正在尝试使用c ++制作计算器,我试图实现错误处理,因此,如果用户输入非算术运算符,它将告诉用户请使用while循环输入一个运算符。问题是,即使用户在第一次运行时输入操作员,while循环仍会执行。

我尝试过在while和perthethesis之间不留空格,我也尝试不使用变量,而只是使用所有条件触发循环。

string getop()
{
  string op;
  int check = 1; 
  cout << "Enter an operator (+ - / *): ";
  cin >> op;
  if ((op != "+") || (op != "-") || (op != "/") || (op != "*"))
  {
    check = 0;
  }
  while (check == 0) // while the input is not a valid operator
  {
    cout << "Invalid operator, please enter a valid operator: ";
    cin >> op;
    if ((op == "+") || (op == "-") || (op == "/") || (op == "*"))
      check = 1;
  }

  return op;
}

问题是,即使用户在第一次运行时输入了运算符,while循环仍会执行。

5 个答案:

答案 0 :(得分:4)

尝试:

(op != "+") && (op != "-") && (op != "/") && (op != "*")

运算符||or运算符(或者,一个或另一个就足够了)。您要使用运算符&&,该运算符会强制所有条件同时成立。

答案 1 :(得分:3)

您要使用AND(&&),而不是OR(||):

if ((op != "+") && (op != "-") && (op != "/") && (op != "*"))
{
  check = 0;
}

答案 2 :(得分:3)

您遇到逻辑错误:

if ((op != "+") || (op != "-") || (op != "/") || (op != "*"))

无论true是什么,这将始终产生op

您要

if ((op != "+") && (op != "-") && (op != "/") && (op != "*"))

一个很好的做法是命名您的逻辑事件。而且,AND链接否定是相当不直观的(也是不可读的)。因此,更好的选择是:

bool is_valid = (op == "+") || (op == "-") || (op == "/") || (op == "*");

if (!is_valid)
    check = 0;

您也不应该use namespace std;-您可以阅读here原因。

答案 3 :(得分:1)

您的问题就在这里

if ((op != "+") || (op != "-") || (op != "/") || (op != "*"))
{
    check = 0;
}

假设为op分配了一个值"+",这意味着所有这些条件的评估结果均为true:op != "-"op != "/"op != "*"。 / p>

由于您使用的是OR(||)运算符,因此如果这些条件的 any 为true,将为check赋值0。实际上,无论op的值是什么,这四个条件之一总是 为真。

您应该改用AND(&&),以便在所有条件都为true时将check分配为0:

if ((op != "+") && (op != "-") && (op != "/") && (op != "*"))
{
    check = 0;
}

答案 4 :(得分:0)

当您有一个由&&连接的断言链时,通常,否定就是对所有断言求反,并用&&改变所有||运算符,反之亦然。

您更改了所有断言,使它们无效,但是您忘记将||更改为&&

在Google中寻找Demorgan定理。