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();
}