如何跳出for循环

fengheooo 2014-07-08 11:43:52
continu只能跳出当前for循环继续for循环,但是我想跳出for之外的for循环如何做呢?
下面的代码我用了goto , 想跳到loop 处的for循环处继续循环,但是不对,不知道怎么做了
谢谢大家解答!!!


for(int i=0;i<nn;i++)
{
loop: for(int j=0;j<p->gcNc[0].cellNc[i].NombreFrequences;j++)
{
int freq = rand() % m +1;
//exist || non satisfait Cii contrainte(CSC). exemple rand() 7,encore rand() 7
if(a[freq] == 1)
{
j--;
continue;

}

//non exist && satisfait contrainte. exemple: rand() 7, apres rand() 8
if(a[freq] != 1)
{
for(int k=0;k<p->gcNc[0].cellNc[i].NombreFrequences;k++)
{
if((p->gcNc[0].cellNc[i].frequences[k]-freq >= Cii || p->gcNc[0].cellNc[i].frequences[k]-freq <= -Cii ))
{
a[freq] = 1;
p->gcNc[0].cellNc[i].frequences[j] = freq;
printf("%d ",p->gcNc[0].cellNc[i].frequences[j]);

}else{
goto loop; ///////////////////////////////////?????????????????????????????????
printf("continue");
}
}
}


}

...全文
1652 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengheooo 2014-07-12
  • 打赏
  • 举报
回复
谢谢大家的解答,我前几天已经改出来了,这样直接就跳出当前循环了,我看到楼上同学已经解答了

for(int i){
     for(int j){
 
     }
     if(){
          for(){
                if(){
                      j--;
                     break;
                }
          }
 
     }

babynet 2014-07-11
  • 打赏
  • 举报
回复
你在内层循环需要break的地方设置一下外层循环需要到达的条件不就完了 for(int i=0;i<nn;i++) { for(int j=0;j<p->gcNc[0].cellNc[i].NombreFrequences;j++) { int freq = rand() % m +1; //exist || non satisfait Cii contrainte(CSC). exemple rand() 7,encore rand() 7 if(a[freq] == 1) { j--; continue; } //non exist && satisfait contrainte. exemple: rand() 7, apres rand() 8 if(a[freq] != 1) { for(int k=0;k<p->gcNc[0].cellNc[i].NombreFrequences;k++) { if((p->gcNc[0].cellNc[i].frequences[k]-freq >= Cii || p->gcNc[0].cellNc[i].frequences[k]-freq <= -Cii )) { a[freq] = 1; p->gcNc[0].cellNc[i].frequences[j] = freq; printf("%d ",p->gcNc[0].cellNc[i].frequences[j]); }else{ printf("continue"); i = nn;//你这里设置一下外循环到达条件不就完了 break; } } } }
sfd1234 2014-07-11
  • 打赏
  • 举报
回复
我是来学习的,谢谢分享!
www_adintr_com 2014-07-10
  • 打赏
  • 举报
回复
这种情况下使用 goto 不用有什么负担,完全可以接受的。 当然,要想更好一点的话就把两个 for 循环放到一个函数里面,然后就可以使用 return 语句退出多层的循环了。 如果把 for 提出来成为函数发现参数太多,而且有很多是要返回出去的话,就该考虑把这些东西封装成一个类用对象来操作了。 C 语言虽然没有 C++ 的类,但是也可以借鉴其思想,使用结构体加配套函数的方法来.
「已注销」 2014-07-10
  • 打赏
  • 举报
回复
goto语句容易陷入死循环,因此要慎用,可以用break来跳出当前循环
万俟宇轩 2014-07-10
  • 打赏
  • 举报
回复
好多大神啊。。可以通过设置标签符来进行跳出语句的判断。。
阿呆_ 2014-07-10
  • 打赏
  • 举报
回复
出于便于理解的目的,你只需要记住在 C/C++中的 "{"和 "}" 本身也是特殊的执行语句。另外goto语句从严格来说也并不是“无条件”跳转,同样并不简单等同于一条汇编的jmp语句,比如除了jmp外它同样会依次执行被跳出块({})的“}”语句。 如果你理解了这些,那么你例子中的问题就很明显了, 最外层循环块的"}"并没有执行--即for(a;b;c)中的c部分被忽略了。所以要更正也很简单, 只要将label放到最外面那个“}”前面就可以了。
707wk 2014-07-09
  • 打赏
  • 举报
回复
引用 21 楼 DuanKong86 的回复:
6,7层判断什么的, 不要那么做, 太崩溃了. 可用用设计来避免, 避免不了的, 可以用 do{ if(a) break; if(b) break; }while(0); 这样来替换
也可以用switch
707wk 2014-07-09
  • 打赏
  • 举报
回复
引用 2 楼 galiniur0u 的回复:
表示用goto的都太nb了,目前不敢用。提供个其它方法。可以设一个标志位,跳出一层循环后立马判断标志位是否需要跳出,需要跳出break;

int judge = 0;
for()
{
for()
{
if(...)
{
judge = 1
continue;
}
}
if(1 == judge)
{
break;
}
}
感觉还不如直接用goto快
cao_julians 2014-07-09
  • 打赏
  • 举报
回复
for(int i=0;i<nn;i++) { loop: for(int j=0;j<p->gcNc[0].cellNc[i].NombreFrequences;j++) { for(int k=0;k<p->gcNc[0].cellNc[i].NombreFrequences;k++) { goto loop; ///////////////////////////////////????????????????????????????????? printf("continue"); } } } } 把结构突出出来,无关跳转的东西去掉了看 i,j,k三层循环,想从k循环跳出,跳到j循环前,此时i值不变,j循环从头开始。。。。这一定是个死循环 所以还要回到算法设计步骤去讨论 你是想 1.从k循环跳出,i不变,j++开始,继续执行? 还是 2.从k循环跳出,i++,,j从头开始,继续执行? 建议还是用"标志变量+continue",continue在它所在的循环中会做一次i++,j++或k++操作 for(int i=0;i<nn;i++) { for(int j=0;j<p->gcNc[0].cellNc[i].NombreFrequences;j++) { int freq = rand() % m +1; //exist || non satisfait Cii contrainte(CSC). exemple rand() 7,encore rand() 7 if(a[freq] == 1) { j--; continue; } //non exist && satisfait contrainte. exemple: rand() 7, apres rand() 8 if(a[freq] != 1) { for(int k=0;k<p->gcNc[0].cellNc[i].NombreFrequences;k++) { leapflag=0; //跳出标志为假 if((p->gcNc[0].cellNc[i].frequences[k]-freq >= Cii || p->gcNc[0].cellNc[i].frequences[k]-freq <= -Cii )) {...... }else{ leapflag=1; ////跳出标志为真 goto next; ///////////////////////////////////????????????????????????????????? printf("continue"); } next: if(leapflag==1) continue; //j++开始----情况1 } } next: if(leapflag==1) continue; //i++开始----情况2 } goto可用,最好向外向后跳,不要向前跳
一根烂笔头 2014-07-09
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
[quote=引用 11 楼 my_live_123 的回复:] 你的格式缩进都进入6,7层的状态!重做吧,重新设计算法!缩进最好不要超过4层,否则,后果自负!
试举一反例:
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <wincon.h>
FILE *f;
char c;
long offset;
char patch[3]="\x1b\x6d";//\x00 default
void main(int argc,char **argv)//".vs\0\x31\0\0\x1f\x00\x08"->".vs\0\x31\0\0\x1b\x6d\x00"
{
    if (argc!=2) {
        printf("VxPatch filename.vx");
        getch();GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,0);
        return;
    }
    if (NULL==(f=fopen(argv[1],"r+b"))) {
        printf("----------Can not find %s!",argv[1]);
        getch();GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,0);
        return;
    }
    while (1) {
        c=fgetc(f);
        if (feof(f)) break;//
        if (c=='.') {
            c=fgetc(f);
            if (feof(f)) break;//
            if (c=='v') {
                c=fgetc(f);
                if (feof(f)) break;//
                if (c=='s') {
                    c=fgetc(f);
                    if (feof(f)) break;//
                    if (c=='\0') {
                        c=fgetc(f);
                        if (feof(f)) break;//
                        if (c=='\x31') {
                            c=fgetc(f);
                            if (feof(f)) break;//
                            if (c=='\0') {
                                c=fgetc(f);
                                if (feof(f)) break;//
                                if (c=='\0') {
                                    c=fgetc(f);
                                    if (feof(f)) break;//
                                    if (c=='\x1f') {
                                        c=fgetc(f);
                                        if (feof(f)) break;//
                                        if (c=='\x00') {
                                            c=fgetc(f);
                                            if (feof(f)) break;//
                                            if (c=='\x08') {
                                                offset=ftell(f);
                                                offset=offset-3;
                                                fseek(f,offset,SEEK_SET);
                                                if (3!=fwrite(patch,1,3,f)) {
                                                    fclose(f);
                                                    printf("----------%s VxPached fwrite error!",argv[1]);
                                                    getch();GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,0);
                                                } else {
                                                    fclose(f);
                                                    printf("OK.");
                                                }
                                                return;
                                            } else break;//
                                        } else break;//
                                    } else if (c=='\x1b') {
                                        fclose(f);
                                        printf("%s is VxPatched. Please type vlc.err!",argv[1]);
                                        getch();GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,0);
                                        return;
                                    } else break;//
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    fclose(f);
    printf("----------%s is not a unVxPached .vx file!",argv[1]);
    getch();GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,0);
}
请牢记:源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要,重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。 [/quote] 恩,书写格式一定程度上反映出设计的优劣,当然不是绝对化。有些算法的深层次嵌套“很难”避免。 你的这个代码,条件判断如此之多,汇编出来的跳转指令也将会很多,它并不是高效的实现,也不是只能如此实现!这代码让不是自己写的人,维护起来似乎不那么简单!
gz_qmc 2014-07-09
  • 打赏
  • 举报
回复
引用 15 楼 henry3695 的回复:
加个分号 loop:;
[size=48px] NB[/size]
zilaishuichina 2014-07-09
  • 打赏
  • 举报
回复

for (int i1 = 0; i1 < 10; i1++) // for1
	{
		bool break1 = false;
		for (int i2 = 0; i2 < 10; i2++) // for2
		{
			bool break2 = false;
			for (int i3 = 0; i3 < 10; i3++) // for3
			{
				bool break3 = false;
				for (int i4 = 0; i4 < 10; i4++) // for4
				{
					bool break4 = false;
					for (int i5 = 0; i5 < 10; i5++) // for5
					{
						break4 = true;
						break; // break for5
					}
					if (break4)
					{
						break3 = true;
						break; // break for4
					}
				}
				if (break3)
				{
					break2 = true;
					break; // break for3
				}
			}
			if (break2)
			{
				break1 = true;
				break; // break for2
			}
		}
		if (break1)
		{
			break; // break for1
		}
	}
jack_wq 2014-07-09
  • 打赏
  • 举报
回复
goto慎用,此处可用break
DuanKong86 2014-07-09
  • 打赏
  • 举报
回复
6,7层判断什么的, 不要那么做, 太崩溃了. 可用用设计来避免, 避免不了的, 可以用 do{ if(a) break; if(b) break; }while(0); 这样来替换
  • 打赏
  • 举报
回复
引用 19 楼 my3439955 的回复:
我能想到的跳出多层循环的方法: 1、return法,直接返回,多少层循环也挡不住 2、goto法,直接跳到程序末尾 3、try-catch法,在需要跳出的地方throw指定异常,在多层循环的外部捕获,则跳出了循环 4、__try-__finlly法,用结构化异常处理包裹住多层循环,则内部可以用__leave关键字体面的跳出循环
其中第一种法不靠谱,第二种法涉及goto不规范,第三种法增加的异常处理的成本,第四种法仅限Windows平台。 不考虑平台限制的话,第四种法是最好的。我实际使用过。
  • 打赏
  • 举报
回复
我能想到的跳出多层循环的方法: 1、return法,直接返回,多少层循环也挡不住 2、goto法,直接跳到程序末尾 3、try-catch法,在需要跳出的地方throw指定异常,在多层循环的外部捕获,则跳出了循环 4、__try-__finlly法,用结构化异常处理包裹住多层循环,则内部可以用__leave关键字体面的跳出循环
fengheooo 2014-07-08
  • 打赏
  • 举报
回复
引用 8 楼 fengheooo 的回复:
[quote=引用 5 楼 zhao4zhong1 的回复:]
for (int i=0;i<nn;i++) {
LOOP2:
    for (int j=0;j<p->gcNc[0].cellNc[i].NombreFrequences;j++) {
        int freq = rand() % m +1;

        //exist || non satisfait Cii contrainte(CSC).  exemple rand() 7,encore rand() 7
        if (a[freq] == 1) {
            j--;
            continue;
        }

        //non exist && satisfait contrainte. exemple: rand() 7, apres rand() 8
        if (a[freq] != 1) {
            for (int k=0;k<p->gcNc[0].cellNc[i].NombreFrequences;k++) {
                int v=p->gcNc[0].cellNc[i].frequences[k]-freq;
                if ( v <= -Cii || Cii <= v) {
                    a[freq] = 1;
                    p->gcNc[0].cellNc[i].frequences[j] = freq;
                    printf("%d ",p->gcNc[0].cellNc[i].frequences[j]);
                } else {
                    i++;//需要加这句才能开始i的下次循环
                    goto LOOP2;
                }
            }
        }
    }
}
for (A;B;C) D;
//等价于
{
 A;
 while (1) {
  if (!(B)) break;
  D;
  C;
 }
}
如果我还想执行完第二个for循环呢,刚这样试了下还有问题

for(int i){
     Loop:
     for(int j){
   
     }
     if(){
          for(){
                if(){
                      j--;
                     goto Loop;
                }
          }

     }

[/quote] Loop写错了,应该在外面
fengheooo 2014-07-08
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
for (int i=0;i<nn;i++) {
LOOP2:
    for (int j=0;j<p->gcNc[0].cellNc[i].NombreFrequences;j++) {
        int freq = rand() % m +1;

        //exist || non satisfait Cii contrainte(CSC).  exemple rand() 7,encore rand() 7
        if (a[freq] == 1) {
            j--;
            continue;
        }

        //non exist && satisfait contrainte. exemple: rand() 7, apres rand() 8
        if (a[freq] != 1) {
            for (int k=0;k<p->gcNc[0].cellNc[i].NombreFrequences;k++) {
                int v=p->gcNc[0].cellNc[i].frequences[k]-freq;
                if ( v <= -Cii || Cii <= v) {
                    a[freq] = 1;
                    p->gcNc[0].cellNc[i].frequences[j] = freq;
                    printf("%d ",p->gcNc[0].cellNc[i].frequences[j]);
                } else {
                    i++;//需要加这句才能开始i的下次循环
                    goto LOOP2;
                }
            }
        }
    }
}
for (A;B;C) D;
//等价于
{
 A;
 while (1) {
  if (!(B)) break;
  D;
  C;
 }
}
如果我还想执行完第二个for循环呢,刚这样试了下还有问题

for(int i){
     for(int j){
     Loop:

     }
     if(){
          for(){
                if(){
                      j--;
                     goto Loop;
                }
          }

     }

pemolin 2014-07-08
  • 打赏
  • 举报
回复
你这代码写的。 你换一下loop: 位置看看。 放到第一层循环右大括号结尾处,一个continu,就继续执行第一层循环了
加载更多回复(12)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧