我在 C: 中有这样的代码
if (count == 5 || count == 8 || count == 9 || count == 10)
{
// Do something
}
可以写得更短吗? 比如:
if (count == 5, 8, 9, 10)
{
// Do something
}
在某些情况下,使用位图是有意义的。
例如,您的测试:
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 的含义。
也许您应该考虑使用不同的算法,但如果没有更多信息就无法判断。
根据您拥有多少个不同的值和不同的分支,有时使用开关会更整洁/更容易:
switch (count)
{
case 5:
case 8:
case 9:
case 10:
do_something();
break;
default:
do_something_else();
break;
}
无法像示例中那样将逗号分隔列表插入到
if
语句本身中,但您可以编写类似的内容来使用逗号分隔列表格式。
int allowed_counts[] = {5, 8, 9, 10};
int i;
for (i = 0; i < 4; i++) {
if (count == allowed_counts[i]) {
...
break;
}
}
尽管如此,switch 语句对于所有列表大小来说计算效率都更高。
我想你正在寻找这样的东西:
所以条件是测试 count 是否为 5, 8, 9, 10:
if (count == 5 || (count >= 8 && count <= 10 ))
printf("count is 5, 8, 9 or 10");
例如
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;
}