C短格式为多个If条件

时间:2014-11-10 22:45:41

标签: c if-statement

我在C:

中有这样的代码
 if (count == 5 || count == 8 || count == 9 || count == 10)
{
<do something>
}

是否有可能写这个更短? 类似的东西:

if (count ==5,8,9,10)
{
<do something>
}

5 个答案:

答案 0 :(得分:4)

根据您拥有的不同数量和不同分支的数量,它有时可以更整洁/更容易使用开关:

switch (count)
{
case 5:
case 8:
case 9:
case 10:
    do_something();
    break;
default:
    do_something_else();
    break;
}

答案 1 :(得分:4)

在某些情况下,使用位图是有意义的。

例如,您的测试:

if (count == 5 || count == 8 || count == 9 || count == 10)

相当于:

if ((1<<count) & 0x720)

值5,8,9和10以值0x720的位编码。

通常,如果您对值5,8,9和10具有有意义的符号常量,那么这将是有意义的,其中0x720由按位&#34;或&#34;构成。 (|)这些常量 - 这将导致代码比您在问题中的简单if更详细。

在实践中,真实世界的代码应该尽量减少使用&#34;魔术数字&#34;。很难说5,8,9和10的值是什么意思。

可能你应该考虑使用不同的算法,但没有更多信息就无法判断。

答案 2 :(得分:3)

如您的示例所示,无法将逗号分隔列表插入到if语句中,但您可以编写类似这样的内容以使用逗号分隔列表格式。

int allowed_counts[] = {5, 8, 9, 10};
int i;
for (i = 0; i < 4; i++) {
    if (count == allowed_counts[i]) {
        ...
        break;
    }
}

虽然,switch语句对所有列表大小的计算效率更高。

答案 3 :(得分:0)

我认为你正在寻找类似的东西:

因此,条件是测试计数是否为5,8,9,10:

if (count == 5 || (count >= 8 && count <= 10 ))
    printf("count is 5, 8, 9 or 10");

答案 4 :(得分:0)

E.g EXIST(count, (5,8,9,10)按照提升的宏观扩展

#include <boost/preprocessor/tuple/to_seq.hpp>
#include <boost/preprocessor/seq/for_each_i.hpp>
#include <boost/preprocessor/control/if.hpp>

#include <stdio.h>

#define F(r, data, i, elem) BOOST_PP_IF(i, ||, ) (data == elem)
#define EXIST(var, values) BOOST_PP_SEQ_FOR_EACH_I(F, var , BOOST_PP_TUPLE_TO_SEQ(values) )

int main(){
    int count;
    scanf("%d", &count);
    if(EXIST(count, (5,8,9,10)))//if( (count == 5) || (count == 8) || (count == 9) || (count == 10) )
        printf("yes\n");
    else
        printf("no\n");
    return 0;
}