如何简洁地将一个变量与多个不同的值进行比较?

6

我知道你可以写出这样的语句:

if (num1 != a && num1 != b && num1 != c ..........&& num1 != z)
   (do something);

但是有没有更简单的方法来将num1变量与其他26个变量进行比较呢?就像这样:

if (num1 != a,b,c,d,e,f,g.......)
   (do something);
5个回答

8
如果 a..g 是连续的常量/枚举值,则只需使用范围检查。
if (num >= a && num <= g)
{
    do_something();
}
else
{
    do_something_else();
}

如果它们是非连续的但是常量,那么可以使用switch语句。

switch (num)
{
    case a:
    case b:
    case c:
    case d:
    case e:
    case f:
    case g:
        do_something();
        break;

    default:
        do_something_else();
        break;
}

否则,如果它们只是任意变量或表达式,那么您可能需要使用多个测试来完成。


@Dave Fraser:是的,default 是一个“万能匹配”,它处理所有没有明确 casenum 值。 - Paul R
1
@Paul R 非常感谢,这真的帮了我很多。 - Crash_Override
1
@Dave:如果一个答案解决了你的问题,请使用左侧的勾选框将其标记为正确。 - Björn Pollex
1
@Martin:他确实说过,“如果它们是常量”。 - flight
@vaichidrewar:不,至少在C、C++及相关语言中不行(原问题是关于C++的)。 - Paul R
显示剩余3条评论

5
您可以将a, ... ,z放入std::set中,然后使用该集合的find方法来检查是否存在num1。这具有对数复杂度,但不允许短路。

4
如果你有一个适合你的数据类型的好哈希算法(或者只使用原始类型),那么std::unordered_set可以在常数时间内提供这个功能。 - ildjarn
@ildjarn: std::unordered_set 只存在于 C++0x 中。在此之前,您必须使用 boost::unordered_set - Björn Pollex
为了简洁起见,通常的 std::/std::tr1::/boost:: 声明已省略。:-] - ildjarn

2

首先,良好的代码设计不应包含太多条件顺序。

如果您的情况确实是这样的,即尝试查看数字是否存在于列表中,其中列表实际上是变量的集合。您可以将这些数字输入列表(向量)并执行查找操作。


0
使用 std::find:
static ValueType values[] = { a, b, ... };
//  ...
if ( std::find( begin( values ), end( values ), num )
        == end( values ) )

0

如果情况允许,将变量存储在单独的类/结构中。

如果您的问题更多地涉及C++中是否有语法允许更小的if语句,则可以在问题中更清楚地表达。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接