gpt4 book ai didi

c - 检查变量是否在 C 中具有枚举值的更好方法

转载 作者:太空宇宙 更新时间:2023-11-04 02:25:47 25 4
gpt4 key购买 nike

我的问题与代码的外观以及它在性能方面的表现有关。

假设我有一个枚举:

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 很丑,尤其是当枚举中有很多值时。第一种方法也可能非常难看,但比其他方法好,尽管根据我的理解,使用大量 && 会降低性能。

总结一下:可读性和性能对我来说非常重要,我真的不确定哪个选项最好,或者也许还有其他方法可以做到这一点?

谢谢。

编辑:我忘了说这些值不是是连续的,情况就是这样,我无法真正改变它。

最佳答案

枚举与使用宏定义常量本质上是一样的,只是枚举将一组关联的常量包装成一种数据类型。这使您的代码更加 self 记录,但实际上并没有提供任何额外的功能。


以下是您的问题出现的两种情况。

案例 1:枚举中的值不是连续的,意味着

enum Foo { FIRST=0, MIDDLE=40, LAST=12 };

bool isInFoo(enum Foo x){
bool found = false;
switch(x){
case FIRST: found = true; break;
case MIDDLE: found = true; break;
case LAST: found = true; break;
}
return found;
}

这样,如果不处理switch内部的所有枚举,就会得到编译时警告。

案例 2:值是连续的。然后检查 enum Bar x 是否在枚举中,你可以这样做

enum Bar { FIRST=10, MIDDLE=11, LAST=12 };
bool isInBar(enum Bar x){ return x >= FIRST && x <= LAST; }

EDIT :根据下面的评论,您可以将 Dummy Last 条目添加到 Bar 作为 OUT_OF_RANGE = LAST+1 然后在函数 isInBar() 你可以检查 x 是否小于 OUT_OF_RANGE,这样如果我们向枚举中添加更多元素,我们就不必更改 isInBar() 函数,因为新添加的值应该更少超过 OUT_OF_RANGE。最后要看你收不收。


请注意,在情况 2 中,枚举值不一定需要是连续的序列号,您可以将它们保留在您希望的任何系列中,但是您需要更改您的 isInBar()相应地。

enum FooBar { FIRST=3, SECOND=6, THIRD=9, FOURTH=15, LAST=12 };

bool isInFooBar(enum FooBar x){
bool found = false;
for(int t=3;t<=15;t+=3)
if(x == t) {
found = true;
break;
}
return found;
}

关于c - 检查变量是否在 C 中具有枚举值的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51429279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com