5

您好,我有以下代码:

enum {a, b, c, d, ..., z} abc;

int main()
{
  int val = 20;
  if (val == a || val == b ||val == c||val == d..... || val == z)
  {
    /*Do something*/
  }
}

有没有其他方法可以让我们跳过该OR操作,因为如果有 1000 个枚举成员,那么我们如何提前检查所有成员。请帮忙。

4

4 回答 4

5

如果在您的情况下,如果表达式的值在编译时已知,则现代编译器应该能够优化此类代码。对于可读性和错误检查,我认为使用 aswitch会更好:

switch (val)  {
 case a:;
 case b:;
 ....
 // your code goes here
}

如前所述,性能方面应该没有太大差异,如果合适的话,编译器会将其转换为表查找(或其他聪明的东西),或者如果val在编译时已知,则完全优化它。

但是您可以在此处获得错误检查编译器的优势。如果您没有default案例,大多数编译器会在您省略枚举常量之一时警告您。另外我认为这更清楚,因为它不会重复val所有地方的评估。

于 2012-10-17T07:56:24.967 回答
1

其他(更快)解决方案如下

bool isInenum (int val)
{
    bool retVal = false
        switch(val)

    {
        case a:
        case b:
        case c:
        case d:
            {
                retVal = true;
            }

    }
    return retVal;
}
于 2012-10-17T20:34:13.397 回答
0

由于枚举器的值是按顺序分配的,因此使用这样的 if 语句就足够了:

如果(val<=z)

于 2012-10-17T06:57:43.890 回答
0

您可以在 C++ 中使用地图。使用地图,您可以编写紧凑的测试,而无需大量==||.

但是您首先需要初始化一个地图,我不确定您是否可以以紧凑的方式为任意枚举执行此初始化。

#include <iostream>
#include <map>

using namespace std;

enum abc { a = 1, b = -1, c = 3, d = 0 };

int main()
{
  map<int, int> m;
  m[a] = m[b] = m[c] = m[d] = 1;
  cout << "b is " << ((m.find(b) == m.end()) ? "NOT " : "") << "in m" << endl;
  cout << "3 is " << ((m.find(3) == m.end()) ? "NOT " : "") << "in m" << endl;
  cout << "10 is " << ((m.find(10) == m.end()) ? "NOT " : "") << "in m" << endl;
  return 0;
}

输出(ideone):

b is in m
3 is in m
10 is NOT in m
于 2012-10-17T07:34:36.777 回答