基于C中的条件实现循环

时间:2015-12-10 06:34:09

标签: c loops for-loop foreach

我有一组需要在两个不同的循环中执行的语句;在检查条件的结果上识别的循环。这种类型有多个这样的集合。

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
    }

2 个答案:

答案 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");
}