【问题标题】:Evaluate several bools, break on first true c++评估几个布尔值,打破第一个真正的 C++
【发布时间】:2011-10-23 14:55:20
【问题描述】:

这里所有的,快速简单的...

我正在编写一个 Evaluate 函数,它通过一堆其他 bool 函数运行。现在,我基本上是在做一个 if,else if 循环(见下文)。关于另一种方法的任何建议???我假设我可以用开关做到这一点,但以前从未像这样使用过它们。

int i = 78;

if (isPrime(i))
{
     cout <<"is prime" << endl;
     return;
}

else if (ismultipleOf23(i))
{
    cout <<"is a multiple of 23" << endl;
    return;
}

else if (isEven(i))
{
    cout <<"is Even" << endl;
    return;
}

else if (isOdd(i))
{
    cout <<"is Odd" << endl;
    return;
}

【问题讨论】:

  • 这是最好的方法。不,你不能在这里方便地使用switch&amp;&amp;|| 有时很简洁,但如果你要产生副作用,那么使用它们会很糟糕。
  • 23 是素数,素数是奇数的子集。 23 的倍数可以是偶数也可以是奇数。 if/else 在这里不起作用。

标签: c++ switch-statement if-statement


【解决方案1】:

您不能使用开关,因为标签必须保持不变。

你的做法是正确的。

【讨论】:

  • 如果它们是 C++11 constexpr 会怎样?
  • @Pubby8,不懂 C++11,无法评论。
【解决方案2】:

您可以删除所有返回,并且不需要检查奇数,因为如果不是偶数,则它必须是奇数。

int i = 78;

if (isPrime(i))
{
   cout <<"is prime" << endl;
}
else if (ismultipleOf23(i))
{
  cout <<"is a multiple of 23" << endl;
}
else if (isEven(i))
{
  cout <<"is Even" << endl;
}
else
{
  cout <<"is Odd" << endl;
}
return;  // This is also optional

【讨论】:

    【解决方案3】:

    这么少的测试不值得,但如果你有很多测试,你可以把它们放在一个列表中并迭代它们:

    #include <iostream>
    #include <string>
    using namespace std;
    
    struct TEST {
        bool (*func)(int);
        string msg;
    };
    
    bool isMult23(int i) { return i % 23 == 0; }
    bool isEven(int i) { return i % 2 == 0; }
    bool isOdd(int i) { return !isEven(i); }
    bool isOther(int i) { return true; } // sentinel, always true
    
    TEST test[] = {
        isMult23,"is multiple of 23",
        isEven,"is even",
        isOdd,"is odd",
        isOther,"is something else"
    };
    
    string eval(int value)
    {
        int i = 0;
        while(!test[i].func(value))
            i++;
        return test[i].msg;
    }
    
    int main()
    {
        cout << eval(46) << endl;
        cout << eval(78) << endl;
        cout << eval(81) << endl;
        return 0;
    }
    

    输出

    is multiple of 23
    is even
    is odd
    

    【讨论】:

      【解决方案4】:

      您可以使用模板、lambda 等做一些疯狂的事情,这样您就可以轻松添加新测试并循环通过测试集,成功执行 lambda 并返回...

      但这太过分了,并且需要一个符合标准的编译器(因为 C++11 现在是标准,我对这种说法很满意)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-11
        • 1970-01-01
        • 1970-01-01
        • 2012-01-12
        • 2017-10-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多