gpt4 book ai didi

C - 检查一个变量是否*没有*许多选项的最简洁的方法?

转载 作者:太空狗 更新时间:2023-10-29 15:21:32 25 4
gpt4 key购买 nike

背景:

通常,我们开发人员必须检查单个变量是否至少是多个选项中的一个。例如,

if ( (data == 125) || (data == 500) || (data == 750) )
{
/* ... do stuff ...*/
}

建议here (虽然是用 C# 编写的),提供了一个优雅的解决方案来使用像这样的 switch 语句,

switch ( data )
{
case 125:
case 500:
case 750:
/* ... do stuff ...*/
break;

default:
/* ... do nothing ... */
break;
}

这对于“或”条件句很有效,但对于像下面这样的否定“或”条件句来说很丑陋,

if ( !( (data == 125) || (data == 500) || (data == 750) ) )
{
/* ... do stuff ...*/
}

可以写成

switch ( data )
{
case 125:
case 500:
case 750:
/* ... do nothing ... */
break;

default:
/* ... do stuff ...*/
break;

}

而且看起来有点老套。

问题:

是否有更简洁的方法来检查单个变量是否没有多个选项,例如上面的否定“或”条件?

引用资料:

最佳答案

我觉得后者还好。

不过,您可以更好地将其形式化:

static bool in_sprawling_set(int data)
{
switch ( data )
{
case 125:
case 500:
case 750:
return true;
}
return false;
}

然后是你想在哪里做的工作:

if(!in_sprawling_set(data))
{
/* do the work, not in set */
}

这将“in set”逻辑置于其自身的函数中,使其适度地 self 记录,并且自从 ! 变得更加突出和最终 if 非常可读(“如果不在庞大的集合中”)。

注意:如果值的数量真的很大,我可能会使用预排序数组和二进制搜索,而不是使用巨大的 switch。我意识到一个足够聪明的编译器可以自己完成这种转换,但是一个巨大的 switch 的可读性会相当低(特别是如果你想每行只放一个 case ).有 bsearch() 用于搜索:

static int cmp_int(const void *ap, const void *bp)
{
const int a = *(const int *) ap, b = *(const int *) bp;
return a < b ? -1 : a > b;
}

static bool in_sprawling_set(int data)
{
static const int values[] = { 125, 500, 750 };
return bsearch(&data, values, sizeof values / sizeof *values, sizeof *values, cmp_int) != 0;
}

有很多样板,但您可以看到列出实际值的部分(唯一会随着添加更多值而增长的部分)更加紧凑。

关于C - 检查一个变量是否*没有*许多选项的最简洁的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38104445/

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