我在C:
中有这样的代码 if (count == 5 || count == 8 || count == 9 || count == 10)
{
<do something>
}
是否有可能写这个更短? 类似的东西:
if (count ==5,8,9,10)
{
<do something>
}
答案 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;
}