我正在尝试使用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循环仍会执行。
答案 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定理。