for문 빠져나가는 break 질문드립니다.

rladmsfhr의 이미지

간추려도 소스가 좀 복잡한듯 하네요.;;

for( ; ; )					// 1번 for
{
            for( ; ; )				// 2번 for
            {
 
            }
 
            for( ; ; )				// 3번 for
            {
                 if( 조건문이 만족하면 )
                 {
                         // 최상위 1번 for문까지 빠져나가고 싶음 
                 }
            }
}

break문구로는 3번 for문을 빠져나갈수있지 1번 for문까진 빠져나가진 못하는데

방법이 없을까요? BOOL 변수하나를 둬서 1번 for문에서 조건문을 하나 더 걸어야 되는건지요.

익명 사용자의 이미지

bool f()
{
for() { if(!g()) return false; }
}
bool g()
{
for() { if(!h()) return false; }
}
bool h()
{
for() { if(contion) return false; }
}

icj7061의 이미지

goto쓰면 되지 않나요?

rladmsfhr의 이미지

goto문은 절대 쓰지 말라고 들어서 계속 지키고 있습니다.근데 외국 개발자가 짜둔 소스를 보다보면

에러가 발생됐을때 주로 goto문을 이용해서 빠져나가던데요.

goto문을 사용해도 상관없나요?

icj7061의 이미지

goto문을 남용하지만 않으면 문제될게 없습니다. 많이 쓰면 가독성이 떨어지겠지만 남들이 보지않는 소스라면야 뭐 많이 써도 되겠지요.
다익스트라가 했던 goto statement considered harmful 때문에 쓰지 말라는 것 같은데,
http://en.wikipedia.org/wiki/Goto#Criticism_and_decline
보면

unrestricted GOTO statements blah blah~~~
라고 써있습니다.

결론은 남용한다면 가독성이 떨어지니 쓰지말라는 겁니다.

klara의 이미지

상관없습니다. goto의 대표적인 활용예가 다중 루프의 탈출입니다. goto가 많으면 로직을 따라가기 힘들어지고 유지보수가 개판되기 쉽기 때문에 쓰지 말라는 건데, 이경우에는 goto로 점프하는 라벨이 가까우며, goto로 회귀하는게 아니기 때문에 흐름이 바뀌지도 않습니다.

mirheekl의 이미지

절대 쓰지 말아야 할 명령이면 존재할 이유가 없습니다. 쓰는 방법의 문제일 뿐이죠.

물론 goto를 쓰지 않는다 해도 예외를 발생시킨다든지 최상위 루프의 체크코드가 거짓이 되게 한다든지 for루프 바깥에서 에러체크를 또 한다든지 아니면 곧바로 함수 리턴을 해버린다든지 하는 방법으로 얼마든지 구현은 할 수 있으나, 모든 방법이 장단점이 있기 때문에 경우에 따라선 goto가 가장 깔끔하고 좋은 해결책이 될 수도 있습니다. goto는 특히 리소스를 해제할 때 탁월한 효과를 발휘하는데 (종료 코드를 쉽게 한 곳으로 모을 수 있으므로), 이때문에 에러 처리에 많이 쓰이는 거겠죠. 특히 예외처리가 어려운 C에서 말이죠.

다만 본인이 죄다 책임지는 코드라면 상관이 없는데 리뷰어가 따로 존재하고 그 리뷰어가 goto는 절대 쓰지 말아야 한다는 신념을 가지고 있는 경우가 간혹 있기 때문에 (...) goto 없이 해결하는 연습을 하는 것도 의미는 있습니다. 이 경우 변수를 새로 선언해가며 루프를 탈출하는 것보다는 (이렇게 처리하면 이걸 또 지적하는 사람이 나옴) 로직을 뜯어고쳐서 아예 그런 일 자체가 필요없도록 만드는 경우가 많았습니다.

--

라스코니의 이미지

goto 써도 됩니다.

매우 많은 경우에 goto는 제어 흐름을 매우 단순화하고 효율적으로 만들수 있습니다.
물론 남용하면 헬이 오겠죠.

또 한가지 방법은 for 루프에서 체크할 수 있는 플래그를 하나 두는 겁니다.

int _exitflag = FALSE;
 
for( ; _exitflag != TRUE ; ) {
    ...
    _exitflag = TRUE;
}

이러면 빠져 나옵니다.

red10won의 이미지

궁금한게 있는데 for문을 저렇게 많이 사용하기도 하나요?

함수화해서 따로 빼는게 좋아 보이네요.
포문을 저렇게 밖에 사용 못한다는건 먼가 이상해 보여서요^^

익명 사용자의 이미지

for( ; ; ) // 1번 for
{
for( ; ; ) // 2번 for
{

}

for( ; ; ) // 3번 for
{
if( 조건문이 만족하면 )
{
// 최상위 1번 for문까지 빠져나가고 싶음
bl=1;
}
}
if(bl == 1) break;
}

라는 형식으로 간단하게 하는데... 조금 비효율적이겠지요?

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.