我有一组需要在两个不同的循环中执行的语句;在检查条件的结果上识别的循环。这种类型有多个这样的集合。
Set A : statement 1
statement 2
statement 3
Set B : statement 4
statement 5
statement 6
and so on..
现在他们需要按如下方式执行:
if(condition 1)
loop over some Loop A
execute Set A
else if(condition 2)
loop over some loop B
execute Set A
These loops can be completely different from each other.
现在,为了清晰代码,我不希望编写如上所述的代码。另一个原因是我必须制作多套以便将它们组合在一起。
我是否有任何机制可以实现以下目标:
CHECK_CONDITION_AND_LOOP_HERE
execute Set A
我尝试使用宏来实现这一点,使用在表达式中的支撑组但不能。我还尝试使用三元运算符以及通过switch case 来实现此目的,但无法获得相同的结果。
在C中有什么办法可以达到预期的行为吗?
问题的示例代码:
if(condition A)
for(i=0; i<10; i++, k*=2) {
execute Set A; //Operations performed here use variable k
}
else if(condition B)
for(j=5; j<75; j+=5, k*=arr[j]) {
execute Set A; //Operations performed here use variable k
}
答案 0 :(得分:4)
问题第1版的答案:
鉴于唯一的区别是执行语句的值范围,您可以使用几个变量来存储范围端点,例如
int first = 0;
int last = -1;
if (condition1) {
first = 1;
last = 10;
} else if (condition2) {
first = 3;
last = 7;
}
for ( int i = first; i <= last; i++ )
execute set A
请注意,如果两个条件都不满足,则将last
初始化为小于first
会阻止循环体运行。
问题第2版的答案:
这里是问题的代码。为了清晰起见,我做了一些改变,并使问题更加具体。
if (cond1)
for (initA;condA;updateA)
execute SetX
else if (cond2)
for (initB;condB;updateB)
execute SetX
这是重构的代码
int is1 = cond1;
int is2 = is1 ? 0 : cond2;
if (is1)
initA;
if (is2)
initB;
while ( (is1 && condA) || (is2 && condB) )
{
execute SetX
if ( is1 )
updateA;
if ( is2 )
updateB;
}
答案 1 :(得分:1)
一个功能,也许?
void func_A() {
printf("Here0\n");
printf("Here1\n");
}
...
if(a < b) {
for(i = 1; i <= 10; i++) {
func_A()
}
}
else if(a == b) {
for(i = 3; i <= 7; i++) {
func_A()
}
}
或者,如果您只想进行一次通话/阻止:
if(a < b) {
min = 1; max = 10;
}
else if(a == b) {
min = 3; max = 7;
}
for(i = 3; i <= 7; i++) {
printf("Here0\n");
printf("Here1\n");
}