user-0 提问: 如何跳出for循环

回复:
user: user-0
content: 谢谢大家的解答，我前几天已经改出来了，这样直接就跳出当前循环了，我看到楼上同学已经解答了  for(int i){      for(int j){        }      if(){           for(){                 if(){                       j--;                      break;                 }           }        }

user: user-1
content: 你在内层循环需要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;                     }                 }             }                                         }

user: user-2
content: 我是来学习的，谢谢分享！

user: user-3
content: 这种情况下使用 goto 不用有什么负担，完全可以接受的。 当然，要想更好一点的话就把两个 for 循环放到一个函数里面，然后就可以使用 return 语句退出多层的循环了。  如果把 for 提出来成为函数发现参数太多，而且有很多是要返回出去的话，就该考虑把这些东西封装成一个类用对象来操作了。 C 语言虽然没有 C++ 的类，但是也可以借鉴其思想，使用结构体加配套函数的方法来.

user: user-4
content: goto语句容易陷入死循环，因此要慎用，可以用break来跳出当前循环

user: user-5
content: 好多大神啊。。可以通过设置标签符来进行跳出语句的判断。。

user: user-6
content: 出于便于理解的目的，你只需要记住在 C/C++中的 "{"和 "}" 本身也是特殊的执行语句。另外goto语句从严格来说也并不是“无条件”跳转，同样并不简单等同于一条汇编的jmp语句，比如除了jmp外它同样会依次执行被跳出块({})的“}”语句。 如果你理解了这些，那么你例子中的问题就很明显了， 最外层循环块的"}"并没有执行--即for(a;b;c)中的c部分被忽略了。所以要更正也很简单， 只要将label放到最外面那个“}”前面就可以了。

user: user-7
content: 引用 21 楼 DuanKong86 的回复:6,7层判断什么的, 不要那么做, 太崩溃了. 可用用设计来避免, 避免不了的, 可以用 do{ if(a) break; if(b) break; }while(0); 这样来替换也可以用switch

user: user-7
content: 引用 2 楼 galiniur0u 的回复:表示用goto的都太nb了，目前不敢用。提供个其它方法。可以设一个标志位，跳出一层循环后立马判断标志位是否需要跳出，需要跳出break；  int judge = 0; for() { for() { if(...) { judge = 1 continue; } } if(1 == judge) { break; } } 感觉还不如直接用goto快

user: user-8
content: 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可用，最好向外向后跳，不要向前跳

user: user-9
content: 引用 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] 恩，书写格式一定程度上反映出设计的优劣，当然不是绝对化。有些算法的深层次嵌套“很难”避免。 你的这个代码，条件判断如此之多，汇编出来的跳转指令也将会很多，它并不是高效的实现，也不是只能如此实现！这代码让不是自己写的人，维护起来似乎不那么简单！

user: user-10
content: 引用 15 楼 henry3695 的回复: 加个分号 loop:;  [size=48px] NB[/size]

user: user-11
content: 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 		} 	}

user: user-12
content: goto慎用，此处可用break

user: user-13
content: 6,7层判断什么的, 不要那么做, 太崩溃了. 可用用设计来避免, 避免不了的, 可以用 do{ if(a) break; if(b) break; }while(0); 这样来替换

user: user-14
content: 引用 19 楼 my3439955 的回复:我能想到的跳出多层循环的方法：  1、return法，直接返回，多少层循环也挡不住  2、goto法，直接跳到程序末尾  3、try-catch法，在需要跳出的地方throw指定异常，在多层循环的外部捕获，则跳出了循环  4、__try-__finlly法，用结构化异常处理包裹住多层循环，则内部可以用__leave关键字体面的跳出循环  其中第一种法不靠谱，第二种法涉及goto不规范，第三种法增加的异常处理的成本，第四种法仅限Windows平台。  不考虑平台限制的话，第四种法是最好的。我实际使用过。

user: user-14
content: 我能想到的跳出多层循环的方法：  1、return法，直接返回，多少层循环也挡不住  2、goto法，直接跳到程序末尾  3、try-catch法，在需要跳出的地方throw指定异常，在多层循环的外部捕获，则跳出了循环  4、__try-__finlly法，用结构化异常处理包裹住多层循环，则内部可以用__leave关键字体面的跳出循环

user: user-0
content: 引用 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写错了，应该在外面

user: user-0
content: 引用 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;                 }           }       }

user: user-15
content: 你这代码写的。 你换一下loop: 位置看看。 放到第一层循环右大括号结尾处，一个continu，就继续执行第一层循环了