C - 检查变量是否为* none *的最简洁方法?

时间:2016-06-29 15:47:28

标签: c if-statement comparison

背景

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

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;

}

似乎有点ha ..

问题:

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

参考文献:

3 个答案:

答案 0 :(得分:8)

我认为后者很好。

你可以更好地将它正式化:

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”逻辑置于其自身的功能中,使其温和地自我记录,并且实际使用位置更加清晰,因为!变得更加突出并且最终{{1}是非常可读的(“如果不在庞大的集合中”)。

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

bsearch()

有很多样板文件正在进行中,但你可以看到列出实际值的部分(随着更多值的增加而增长的唯一内容)更加紧凑。

答案 1 :(得分:1)

您可以随时使用De-morgans法则来简化表达式

,而不是否定条件
if (data != 125 && data != 500 && data != 750) ...

答案 2 :(得分:-1)

  

是否有更简洁的方法来检查单个变量是否不是很多选项?

switch()声明无疑是一个很好的解决方案。

作为替代方案,如果产品没有溢出,代码可以使用单个分支测试:

unsigned data = foo();
if ( (data - 125) * (data - 500) * (data - 750) ) {
  /* ... do stuff as long as data is not 125, 500  or 750 ...*/
}

如果更清楚 - 不是真的,它是否比switch()更快? 它有潜力