C ++ |重复使用条件

时间:2017-09-29 09:16:24

标签: c++ optimization conditional redundancy

我目前正在用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 != '-' );

正如您所看到的,我已经两次使用完全相同的条件反馈(如果)以在输入无效时继续循环。我的问题是,如何减少上面代码的冗余?你可以将条件存储在变量中吗?

4 个答案:

答案 0 :(得分:3)

这样的东西
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);

答案 1 :(得分:1)

只需编写一个功能

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

答案 2 :(得分:1)

是的,您可以将条件存储在变量中。有点。 C ++中的bool类型变量可以存储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()并使用它们的否定。

答案 3 :(得分:1)

使用lambda的许多方法中的另一种:

// use zero value as an error indicator and initial condition
char operatorSign = '\0';

auto check_ok = [&]
{
    switch(operatorSign)
    {
        case '*': case '/': case '+': case '-':
            break;
        default:
            std::cout << "Must be a valid operator sign (*, /, + or -).\a\n\n";
            operatorSign = '\0';
            break;
    }
};

while(!operatorSign)  
{
    cout << "Enter operator: "; cin >> operatorSign;
    check_ok();
}