C++ |重用条件
C++ | Reuse conditions
我目前正在用 C++ 编写一个简单的计算器程序,每当我想检查 cin
值是否有效,并在输入无效时向用户反馈,我必须重用在我的 do-while 循环及其嵌套的 if 语句中提供反馈的条件。这感觉有点多余。
这是有问题的代码:
do {
cout << "Enter operator: "; cin >> operatorSign;
if ( operatorSign != '*' && operatorSign != '/'
&& operatorSign != '+' && operatorSign != '-' )
cout << "Must be a valid operator sign (*, /, + or -).\a\n\n";
} while ( operatorSign != '*' && operatorSign != '/'
&& operatorSign != '+' && operatorSign != '-' );
如您所见,我已经两次重复使用完全相同的条件进行反馈 (if) 和 如果输入无效则继续循环。我的问题是,如何减少上面代码的冗余?您可以将条件存储在变量或其他东西中吗?
简单写一个函数
bool isOpInvalid(char op) {
return op != '*' && op != '/' && op != '+' && op != '-';
}
并将循环更改为
do {
cout << "Enter operator: ";
cin >> operatorSign;
if (isOpInvalid(operatorSign))
cout << "Must be a valid operator sign (*, /, + or -).\a\n\n";
} while (isOpInvalid(operatorSign));
或者写一个while
循环
while (true) {
cout << "Enter operator: ";
cin >> operatorSign;
if (operatorSign != '*' && operatorSign != '/'
&& operatorSign != '+' && operatorSign != '-')
cout << "Must be a valid operator sign (*, /, + or -).\a\n\n";
else
break;
}
类似
bool isValid;
do {
isValid = true;
cout << "Enter operator: ";
cin >> operatorSign;
if ( operatorSign != '*' && operatorSign != '/' && operatorSign != '+' && operatorSign != '-' )
{
cout << "Must be a valid operator sign (*, /, + or -).\a\n\n";
isValid = false;
}
} while (!isValid);
是的,您可以将条件存储在变量中。有点。 bool
C++中的类型变量可以存储true
/false
个值。
bool isInvalid = peratorSign != '*' && operatorSign != '/'
&& operatorSign != '+' && operatorSign != '-';
然后 if (isInvalid)
和 while (isInvalid)
不过,您应该查看设置变量的位置。
但是,我要做的是创建一个函数来检查选择是否有效并调用它。
bool isInvalid(operatorSign)
{
return peratorSign != '*' && operatorSign != '/'
&& operatorSign != '+' && operatorSign != '-';
}
然后 if (isInvalid(operatorSign))
和 while (isInvalid(operatorSign))
我不想一次更改太多,但创建 isValid
/ isValid()
并使用它们的否定似乎更好。
许多方法中的另一种,使用 lambda:
// use zero value as an error indicator and initial condition
char operatorSign = '[=10=]';
auto check_ok = [&]
{
switch(operatorSign)
{
case '*': case '/': case '+': case '-':
break;
default:
std::cout << "Must be a valid operator sign (*, /, + or -).\a\n\n";
operatorSign = '[=10=]';
break;
}
};
while(!operatorSign)
{
cout << "Enter operator: "; cin >> operatorSign;
check_ok();
}
我目前正在用 C++ 编写一个简单的计算器程序,每当我想检查 cin
值是否有效,并在输入无效时向用户反馈,我必须重用在我的 do-while 循环及其嵌套的 if 语句中提供反馈的条件。这感觉有点多余。
这是有问题的代码:
do {
cout << "Enter operator: "; cin >> operatorSign;
if ( operatorSign != '*' && operatorSign != '/'
&& operatorSign != '+' && operatorSign != '-' )
cout << "Must be a valid operator sign (*, /, + or -).\a\n\n";
} while ( operatorSign != '*' && operatorSign != '/'
&& operatorSign != '+' && operatorSign != '-' );
如您所见,我已经两次重复使用完全相同的条件进行反馈 (if) 和 如果输入无效则继续循环。我的问题是,如何减少上面代码的冗余?您可以将条件存储在变量或其他东西中吗?
简单写一个函数
bool isOpInvalid(char op) {
return op != '*' && op != '/' && op != '+' && op != '-';
}
并将循环更改为
do {
cout << "Enter operator: ";
cin >> operatorSign;
if (isOpInvalid(operatorSign))
cout << "Must be a valid operator sign (*, /, + or -).\a\n\n";
} while (isOpInvalid(operatorSign));
或者写一个while
循环
while (true) {
cout << "Enter operator: ";
cin >> operatorSign;
if (operatorSign != '*' && operatorSign != '/'
&& operatorSign != '+' && operatorSign != '-')
cout << "Must be a valid operator sign (*, /, + or -).\a\n\n";
else
break;
}
类似
bool isValid;
do {
isValid = true;
cout << "Enter operator: ";
cin >> operatorSign;
if ( operatorSign != '*' && operatorSign != '/' && operatorSign != '+' && operatorSign != '-' )
{
cout << "Must be a valid operator sign (*, /, + or -).\a\n\n";
isValid = false;
}
} while (!isValid);
是的,您可以将条件存储在变量中。有点。 bool
C++中的类型变量可以存储true
/false
个值。
bool isInvalid = peratorSign != '*' && operatorSign != '/'
&& operatorSign != '+' && operatorSign != '-';
然后 if (isInvalid)
和 while (isInvalid)
不过,您应该查看设置变量的位置。
但是,我要做的是创建一个函数来检查选择是否有效并调用它。
bool isInvalid(operatorSign)
{
return peratorSign != '*' && operatorSign != '/'
&& operatorSign != '+' && operatorSign != '-';
}
然后 if (isInvalid(operatorSign))
和 while (isInvalid(operatorSign))
我不想一次更改太多,但创建 isValid
/ isValid()
并使用它们的否定似乎更好。
许多方法中的另一种,使用 lambda:
// use zero value as an error indicator and initial condition
char operatorSign = '[=10=]';
auto check_ok = [&]
{
switch(operatorSign)
{
case '*': case '/': case '+': case '-':
break;
default:
std::cout << "Must be a valid operator sign (*, /, + or -).\a\n\n";
operatorSign = '[=10=]';
break;
}
};
while(!operatorSign)
{
cout << "Enter operator: "; cin >> operatorSign;
check_ok();
}