【发布时间】:2018-07-19 18:07:28
【问题描述】:
我的问题与代码的外观以及它在性能方面的表现有关。
假设我有一个枚举:
typedef enum {
THIS_IS_A_VALUE1 = 65,
THIS_IS_A_VALUE2 = 10,
THIS_IS_A_VALUE3 = 45,
THIS_IS_A_VALUE4 = 5,
THIS_IS_A_VALUE5 = 7
} I_AM_AN_ENUM;
我想检查某个变量是否包含枚举中的值之一: 我想了三种方法:
1.
int val;
if(val != THIS_IS_A_VALUE1 && val != THIS_IS_A_VALUE2 && val != THIS_IS_A_VALUE3...)
{
// val is different than all values
// do something
}
2.
if(val != THIS_IS_A_VALUE1)
{
// keep blank
}
else if(val != THIS_IS_A_VALUE2)
{
// keep blank
}
else if(val != THIS_IS_A_VALUE3)
{
// keep blank
}....
else
{
// val is different than all values
// do something
}
3.
switch(val)
{
case THIS_IS_A_VALUE1:
case THIS_IS_A_VALUE2:
case THIS_IS_A_VALUE3:
..
..
default:
// val is different than all values
// do something
}
说实话,我觉得 2 和 3 很难看,尤其是当枚举中有很多值时。 第一种方法也可能很丑陋,但比其他方法更好,尽管根据我的理解使用大量 && 会降低性能。
总结一下:可读性和性能对我来说非常重要, 我真的不确定哪个选项是最好的, 或者也许还有其他方法可以做到这一点?
谢谢。
编辑:我忘了提到这些值是不是连续的,就是这样,我无法真正改变它。
【问题讨论】:
-
对我来说听起来像是 XY 问题。你为什么要这样做?
-
如果需要扩展,使用hashmap查找。 stackoverflow.com/questions/838404/implementing-a-hashmap
-
为什么你有一个带有随机值的 ENUM,而不是序列号?如果它们是连续的,您只需检查范围即可。
-
从您的代码中,在我看来,您想查看枚举是否真的在 外部 任何定义的值 - 这对我来说似乎是一个不同的问题。
-
@Barmar 在某些软件技术领域中,除了顺序范围之外,还很常见。嵌入式浮现在脑海中。
标签: c performance enums code-readability