C中的break语句

时间:2011-07-18 04:13:22

标签: c

我是自己编程学习C的新手。

以非递减顺序给出整数列表。您需要删除重复的元素,并仅使用唯一元素输出列表。

实施例: 输入:2 3 5 6 8 8 9 11 11 11 20 输出:2 3 5 6 8 9 11 20

这是我的代码有效。但如果我删除“else break”语句(我知道这会产生错误的输出),为什么它给了我输出2 3 5 6 8 8 9 11?我想我还没有掌握休息的逻辑。

谢谢!

#include <stdio.h>
#define MAXSIZE 100
typedef int ElemType;
typedef struct{
    ElemType data[MAXSIZE];
    int length;
}SqList;

void Create_SqList(SqList *L, int n){
        L->length=n;
    int i=0;
    printf("\ninput %d data: ", n);
    while(i<n){
        scanf("%d", &L->data[i]);
        i++;
    }
}

void Print_SqList(SqList *L){
    int i, n;
    n=L->length;
    i=0;
    printf("\noutput %d data: ", n);
    while(i<n){
        printf("%d ", L->data[i]);
        i++;
    }
    printf("\n");
}

void Reduce_SqList(SqList *L){
    int n = L->length;
    int i, j, k, count=0;
    ElemType t;
    for(i=0;i<n;i++){
       t=L->data[i];
       for(j=i+1;j<n;j++){
        if(L->data[j]==t)   
            count++;    
             else break;      // without break, it produeced the wrong output!
       }


       if(count){
        for(k=j;k<n;k++)
            L->data[k-count]=L->data[k];
        n=n-count;
        count=0;
       }
    }
    L->length=n;
}


int main(){
    SqList L;
    int n;
    printf("\ninput n: ");
    scanf("%d",&n);
    Create_SqList(&L,n);
    Print_SqList(&L);
    Reduce_SqList(&L);
    Print_SqList(&L);

    return 0;
}

5 个答案:

答案 0 :(得分:1)

break立即退出循环。

for(j=i+1;j<n;j++){
    if(L->data[j]==t)   
        count++;    
             else break;      // without break, it produeced the wrong output!

   }

首先,让它更具可读性。

for(j=i+1;j<n;j++) {
    if(L->data[j]==t) { 
        count++;    
    } else {
        break;
    }
}

此代码完全相同,但更具可读性。在没有阅读其余解决方案的情况下,我可以解释为改变程序的流程正在做些什么。

for循环向上计数直到条件j <1。 n不再符合。

但是,它也可以通过“break”语句终止。因此,对于你添加的if条件,只要L-> data [j]!= t,循环也会终止,这会触发break你的代码离开循环的else子句。程序在循环后立即继续执行。

答案 1 :(得分:0)

“break”只会终止你的“for()”循环。内部的“for()”循环。

因此循环将执行UNTIL:

  • j&gt; = n

    ...或......

  • L-&gt; data [j]!= t

以先到者为准:)

答案 2 :(得分:0)

break使控制流刚跳出当前循环结构(forwhiledo-while)。在您的示例中,如果您跳出逻辑,则逻辑会有所不同,并且当您break时它会提前结束计数。如果不这样做,那么循环将继续运行,并且您将获得更多结果。

答案 3 :(得分:0)

中断突破当前循环。您可以使用它来打破For循环,While循环或Do循环。您还可以使用它来断开switch语句,以防止逻辑流入下一个switch子句。

答案 4 :(得分:0)

我发现了你的错误:你依赖j是重复值的最后位置。没有中断j递增,直到它等于n。

这弄乱了这里的逻辑:

   if(count){
    for(k=j;k<n;k++)
        L->data[k-count]=L->data[k];
    n=n-count;
    count=0;
   }
}
L->length=n;