多个 If 条件的 C 缩写形式

问题描述 投票:0回答:5

我在 C: 中有这样的代码

if (count == 5 || count == 8 || count == 9 || count == 10)
{
    // Do something
}

可以写得更短吗? 比如:

if (count == 5, 8, 9, 10)
{
    // Do something
}
c if-statement conditional-statements comparison
5个回答
4
投票

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

例如,您的测试:

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

相当于:

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

值 5、8、9 和 10 被编码在值

0x720
的位中。

通常,如果您对值 5、8、9 和 10 有有意义的符号常量,并且

0x720
由这些常量的按位“或”(
|
) 构造而成,这会产生更多结果比问题中简单的
if
代码更详细。

在实践中,现实世界的代码应该尽量减少“幻数”的使用。很难说出值 5、8、9 和 10 的含义。

也许您应该考虑使用不同的算法,但如果没有更多信息就无法判断。


4
投票

根据您拥有多少个不同的值和不同的分支,有时使用开关会更整洁/更容易:

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

3
投票

无法像示例中那样将逗号分隔列表插入到

if
语句本身中,但您可以编写类似的内容来使用逗号分隔列表格式。

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

尽管如此,switch 语句对于所有列表大小来说计算效率都更高。


0
投票

我想你正在寻找这样的东西:

所以条件是测试 count 是否为 5, 8, 9, 10:

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

0
投票

例如

EXIST(count, (5,8,9,10)
通过boost宏扩展

#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;
}
© www.soinside.com 2019 - 2024. All rights reserved.