背景
通常,我们开发人员必须检查单个变量是否至少是众多选项中的一种。例如,
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 的许多选项,例如上面的否定“或”条件?
参考文献:
答案 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()
更快? 它有潜力。