다중 for문에서 빠져나가려면..?

sadrove의 이미지

예를 들어..

for(i=0; i<100; i++)
for(j=0; j<100; j++)
for(t=0; t<100; t++)
if(sum == 100)
break;

위와 같이 있을때요..
break;로는 for문 하나밖에 못 빠져나가는 걸로 알고 있는데..
이 for문 전체를 다 빠져나가고 싶으면 어케해야 할까요..?...
전 그냥 Goto문으로 했는데..웬지 더좋은방법이있을꺼 가타서..^^...

맹고이의 이미지

C 에서는 goto를 안쓴다면
하나씩 빠져나갈수 밖에 없는걸로 압니다..
결국 flag를 줘서 break 계속 걸어주는 수밖에
없는거 같아요..

kslee80의 이미지

C 에서 다중루프 빠져나가는데는 goto 만한게 없습니다..
플래그를 주는 방법도 있고...다중루프문만을 따로 함수로 만들어서
return 시키는 방법도 있겠지만....
효율로 따진다면 goto 만한게 없습니다..
게다가, goto 는 어셈블리 코드 한줄로 끝나죠;;;

structured programming 방식에서는 쓰면 안되는 것으로 인식되는것이
goto 지만, 이런면에 있어서는 goto 를 인정해야 하죠..

자바에서도 break [label] 을 만들어서 다중루프를 빠져나갈수 있게 해 놓았죠....

charsyam의 이미지

그럴 때는 goto를 쓰세요.

독도 잘쓰면 약이 된다는 것처럼, goto 역시, 적절히 잘 쓰면 좋습니다.

그럼 고운 하루.

=========================
CharSyam ^^ --- 고운 하루
=========================

sunyzero의 이미지

예전에도 goto에 대해서 논쟁이 있었습니다. goto를 배제하는 로직을 짜야만 structured programming을 잘 짠거다, 아니다란 논쟁이 있었지만 거의 소모적이었습니다.

사실 너무 심한 루프에는 goto로 에러를 처리하거나 마지막 뭐 정리작업(?, 메모리회수나 세션정리같은거)을 해치우는게 깔끔한것 같습니다. 저도 아주 가끔은 goto를 쓰는데 오히려 보기 좋을때도 많습니다.(저는 goto 옹호론자) 하지만, 많이 쓰면 필수적으로 지저분해지죠. 한개 이상은 좀 자제하는게... ^^*

========================================
* The truth will set you free.

purewell의 이미지

exception...

try
{
  for(;;) for(;;) for(;;) ... for(;;) {throw i;}
}

catch(int i)
{
  (void*)&
  // some processing...
}

_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz

송지석의 이미지

옷 exception이 c에서도 되나요?
그리고 (void*)& 의 용도는요?

송지석의 이미지

[rommance@cross exception]$ man try
man: 그런 파일이나 디렉토리가 없음
Failed to open the message catalog man on the path NLSPATH=<none>

없다는데요.. 음..

#include <stdio.h>

int main()
{
        int i,j;

        try
        {
                for(i=0; i<100; i++) {
                        for (j=0;j<100;j++) {
                                printf("%d, %d\t", i, j);
                                if (i==20)
                                        throw i;
                        }
                }
        }
        catch (int i)
        {
                printf("catched! %d\n", i);
        }
        printf("end of program=n");
        return 0;
}

Quote:
[rommance@test exception_test]$ gcc main.c
main.c: In function `main':
main.c:8: `try' undeclared (first use in this function)
main.c:8: (Each undeclared identifier is reported only once
main.c:8: for each function it appears in.)
main.c:8: parse error before `{'
main.c:9: parse error before `)'
main.c:10: parse error before `)'
main.c:13: `throw' undeclared (first use in this function)
main.c:13: parse error before `i'
main.c: At top level:
main.c:15: parse error before `}'
main.c:21: parse error before string constant
main.c:21: warning: data definition has no type or storage class
해밝의 이미지

^^;;

asheap의 이미지

C++에서의 예외의 잘못된 사용의 대표적인 예로
goto 써서 빠져나와야할 곳에다 예외를 사용하는 것이 꼽히지요...

레모네이드의 이미지

try {
   for(;;) {
      for(;;) {
         throw;
      }
   }
} catch(...) {
 
}

이런 구문이야 문제가 되겠지만....( 내부의 다른 함수나 그런 놈들이 예외 throw 던지면 이 함수의 catch가 잡아버려서 어이없게되는)

다음처럼 하면 try {} catch{} 도 나름 깔끔하지 않을까요..

void somfunction () {
    class escapeLoop{};
    ...
    try {
        for(;;) {
            for(;;) {
                if() throw escapeLoop();
            }
        }
    } catch(escapeLoop) {}
}

대략 goto 쓰는 방법과 동일한 이펙트를 줄거라고 생각됩니다...
예외의 명칭이 escapeLoop 루프를 탈출해라.....이런식으로 하면 명시적이고 깔끔하지 않나요?
그리고 마구잡이 catch(...) 도 아니고 많이 사용되는 기본형 int 따위로 잡는것도 아니고...
함수내부에서만 정의되는 예외 클래스 사용하므로, 함수 밖에서 사용될 염려도 없고, 내부에서 호출하는 함수중에서
이 예외를 던질놈도 없고....
다중루프 한번에 탈출시키는데 아무 문제 없다고 생각됩니다...
대략 throw를 goto 문으로 catch(escapeLoop) 를 레이블로 생각하면 되겠네요...
vacancy의 이미지

goto를 좋아하진 않는 유저입니다만,
다중 loop에서 빠져나올때만큼은 goto가 좋은것 같네요.
물론 java같이 break [label]; 이 지원되면 더 좋겠지만요.

경우에 따라서는 필요한 부분을 function나 procedure로 만들어서
빠져나와야할 때 return 해버리는 것도 괜찮은 방법이라고 생각합니다.

xyhan의 이미지

for(i=0; i<100||sum!=100; i++) 
for(j=0; j<100||sum!=100; j++) 
for(t=0; t<100; t++) 
if(sum == 100) 
break; 

글세요 저는 Goto를 써보질 않아서....
너무 효율적이지 못 한가요..
이런 것도 있죠..
for(i=0; i<100; i++) 
for(j=0; j<100; j++) 
for(t=0; t<100; t++) 
if(sum == 100) 
{
i=100;
j=100;
t=100;
}

============================================================

선한 인간이냐 악한 인간이냐는 그사람의 의지에 달렸다. -에픽테토스-
의지 노력 기다림은 성공의 주춧돌이다. -파스퇴르-

============================================================

beta의 이미지

저두 goto 를 추천합니다만, 굳이 goto 가 싫타면야... 이런 방법도...

      1 #include <stdio.h>
      2
      3 int main()
      4 {
      5     int i, j, t, sum, cond;
      6
      7     cond = 1;
      8
      9     for(i=0; i<100||sum!=100, cond; i++)
     10         for(j=0; j<100||sum!=100, cond; j++)
     11             for(t=0; t<100, cond; t++) {
     12                 if( 100 == (sum = i+j+t) )  cond = 0;
     13                                                           printf("%d\n", sum);
     14             }
     15
     16     exit(0);
     17 }


for ( clause-1 ; expression-2 ; expression-3 ) statement

{
clause-1 ;
while ( expression-2 ) {
        statement
        expression-3 ;
}
}

expression-2 가 0 이면 종료.

sadrove wrote:
예를 들어..

for(i=0; i<100; i++)
for(j=0; j<100; j++)
for(t=0; t<100; t++)
if(sum == 100)
break;

위와 같이 있을때요..
break;로는 for문 하나밖에 못 빠져나가는 걸로 알고 있는데..
이 for문 전체를 다 빠져나가고 싶으면 어케해야 할까요..?...
전 그냥 Goto문으로 했는데..웬지 더좋은방법이있을꺼 가타서..^^...

발 담갔다. 이제 익숙해 지는길만이..

liberta의 이미지

for 구문과, 그것에서 참조되는 변수들(만)을 참조할 수 있는 다른 함수를
써도 무방한 경우라면, 그걸 쓰죠 :-)

int main (void) {
  double tensor[X][Y][Z];
  /* 여기서 하지 말고...
  unsigned i, j, k;
  */

  .....
  err_code = func (tensor);
  .....

  return 0;
}

int func (double ***) {
  int err_code;
  unsigned i, j, k;

  for...
    for...
      for... {
        ....
        switch (또는 if나 뭐라도...) {

        }
        return err_code; /* 뭔가 문제 있다는 정보까지 알 수 있음 */
      }

  return err_code; /* 아무 문제 없음! */
}

그런데 저라도 왠만하면 그냥 goto 쓰거나, 아니면 break 몇 번으로
쓰겠습니다.. :D

sadrove의 이미지

에구...이렇게 많이 알려주시니...부담이...^^

감사합니다..

많은 도움이 되었습니다...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.