C语言中的break语句

C语言中的break语句,c,C,我是一个自学C语言编程的新手 给出一个整数列表,按非减量顺序排列。您需要删除重复的元素并仅输出具有唯一元素的列表 例如: 输入:235688911120 产出:2356891120 这是我的代码。但是如果我删除“else break”语句(我知道这会产生错误的输出),它为什么会给我输出2 3 5 6 8 9 11?我想我还没有掌握突破的逻辑 谢谢 #include <stdio.h> #define MAXSIZE 100 typedef int ElemType; typedef

我是一个自学C语言编程的新手

给出一个整数列表,按非减量顺序排列。您需要删除重复的元素并仅输出具有唯一元素的列表

例如: 输入:235688911120 产出:2356891120

这是我的代码。但是如果我删除“else break”语句(我知道这会产生错误的输出),它为什么会给我输出2 3 5 6 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;
}
#包括
#定义最大尺寸100
typedef int ElemType;
类型定义结构{
ElemType数据[MAXSIZE];
整数长度;
}SqList;
void Create_SqList(SqList*L,int n){
L->长度=n;
int i=0;
printf(“\n输入%d个数据:”,n);
而(idata[i]);
i++;
}
}
无效打印列表(SqList*L){
inti,n;
n=L->长度;
i=0;
printf(“\n输出%d数据:”,n);
而(idata[i]);
i++;
}
printf(“\n”);
}
void Reduce_SqList(SqList*L){
int n=L->长度;
int i,j,k,count=0;
元素类型t;
对于(i=0;idata[i];
对于(j=i+1;jdata[j]==t)
计数++;
else break;//没有中断,它产生了错误的输出!
}
如果(计数){
对于(k=j;kdata[k-count]=L->data[k];
n=n计数;
计数=0;
}
}
L->长度=n;
}
int main(){
sqlistl;
int n;
printf(“\n输入n:”);
scanf(“%d”和“&n”);
创建_SqList(&L,n);
打印列表(&L);
缩减列表(&L);
打印列表(&L);
返回0;
}
中断只会终止“for()”循环。内部的“for()”循环

因此,循环将一直执行到:

  • j>=n

    ……或者

  • L->data[j]!=t

以先到者为准:)

中断只会终止“for()”循环。内部的“for()”循环

因此,循环将一直执行到:

  • j>=n

    ……或者

  • L->data[j]!=t


以先到者为准:)

中断
使控制流跳出当前循环结构(
for
while
do while
)。在您的示例中,如果跳出,逻辑是不同的,当您
中断时,它会提前结束计数。如果不这样做,则循环将继续运行,并获得更多结果。

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

break
立即退出循环

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

   }
(j=i+1;jdata[j]==t) 计数++; 否则会中断;//没有中断,它产生了错误的输出! }
首先,让我们让它更具可读性

for(j=i+1;j<n;j++) {
    if(L->data[j]==t) { 
        count++;    
    } else {
        break;
    }
}
(j=i+1;jdata[j]==t){ 计数++; }否则{ 打破 } }
这段代码做了完全相同的事情,但可读性更强。不必阅读其余的解决方案,我就可以解释break是如何改变程序流的

for循环向上计数,直到不再满足条件j
但是,它也可以通过“break”语句终止。因此,使用您添加的if条件,只要L->data[j]!=t、 这将触发else子句,该子句将
中断
使您的代码脱离循环。循环结束后,程序立即继续执行

break
立即退出循环

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

   }
(j=i+1;jdata[j]==t) 计数++; 否则会中断;//没有中断,它产生了错误的输出! }
首先,让我们让它更具可读性

for(j=i+1;j<n;j++) {
    if(L->data[j]==t) { 
        count++;    
    } else {
        break;
    }
}
(j=i+1;jdata[j]==t){ 计数++; }否则{ 打破 } }
这段代码做了完全相同的事情,但可读性更强。不必阅读其余的解决方案,我就可以解释break是如何改变程序流的

for循环向上计数,直到不再满足条件j
但是,它也可以通过“break”语句终止。因此,使用您添加的if条件,只要L->data[j]!=t、 这将触发else子句,该子句将
中断
使您的代码脱离循环。循环结束后,程序立即继续执行

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

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

我发现了您的错误:您依赖于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;
if(计数){
对于(k=j;kdata[k-count]=L->data[k];
n=n计数;
计数=0;
}
}
L->长度=n;

我发现了您的错误:您依赖于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;
if(计数){
对于(k=j;kdata[k-count]=L->data[k];
n=n计数;
计数=0;
}
}
L->长度=n;