문제

나는 알고 싶은 가능한 경우 최종 루 C++에서면 끝나는 상태(에서 다른 reacheing 오른쪽 번호의 반복)이 확인할 수 있습니다.예를 들어:

for (int i = 0; i < maxi; ++i)
    for (int j = 0; j < maxj; ++j)
        // But if i == 4 < maxi AND j == 3 < maxj, 
        // then jump out of the two nested loops.

저는 이것이 가능한 펄에서 다음 또는 레이블이 마지막 라벨 통화를 표시하고 표시된 블록,그것은 그렇게 할 수 있다는 C++에서는 내가 사용하는 동안 반복?

감사합니다.

도움이 되었습니까?

해결책

사용할 수 있습니다 return 키워드:이동이 중첩된 루프로 서브루틴 호출 서브루틴을 실행하는 루프를,그리고'복귀에서'서브루틴을 종료[all]합니다.

다른 팁

에도 불구하고"goto 유해한 것으로 간주"인수,이처럼 보인을 위한 완벽한 장소 goto.는 기본적으로 무엇을 하에서는 Perl.심각하게...대체 방법을 고려해 보십시오:

여분의 상태변수


for (int i=0; i<maxi; ++i) {
    bool leaveLoop = false;
    for (int j=0; j<maxj; ++j) {
        if (i == 4 && j == 3) {
            leaveLoop = true;
            break; // leave the inner loop
        }
    }
    if (leaveLoop) {
        break; // leave the outside loop
    }
}

하여 예외가


try {
    for (int i=0; i<maxi; ++i) {
        for (int j=0; j<maxj; ++j) {
            if (i == 4 && j == 3) {
                throw leave_loop();
            }
        }
    }
} catch (leave_loop const&) {
}

복잡한 로직


int j = 0;
for (int i=0; i<maxi && !(i==4 && j==3); ++i) {
    for (j=0; j<maxj && !(i==4 && j==3); ++j) {
        // inner loop
    }
}

goto


for (int i=0; i<maxi; ++i) {
    for (int j=0; j<maxj; ++j) {
        if (i==4 && j==3) {
            goto leave_loop;
        }
    }
}
leave_loop:

마지막 하나입니다 적은 명확한가?내가 믿지 않는 것입니다.그것은 더 이상 연약한?이 문서를 작성하는 다른 사람은 아주 오류가 발생하고 깨지기 쉬운 비교 goto 버전입니다.죄송하는 것에 서 있는 비누 상자기하지만 이것은 뭔가가 나를 귀찮게 하는 동안;)

는 유일한 것이 있어야 congnizent 의 goto 고 예외는 거의 비슷합니다.그들은 그들 모두 열의 기회를 누수 자원 및 무엇인지 않도록 그들을 치료하.

이 말을 하자으로 단호하고(그러나 정중하게;-)나는 할 수 있습니다: for 건설에서는 c 언어에 대한하지 않습니다.

테스트는지 여부를 결정을 계속할 수 있도와 관련이 있는 목적의 루프update 식지 않을 것"중 하나를 추가하여 카운터".

for (int i = 0, j = 0; i < maxi && j < maxj && i != 4 && j != 3;) {
    if (j < maxj) {
        ++j;
    } else {
        j = 0;
        ++i;
    }
}

것 하나의(상당히 임의의)방법을 다시 작성되었습니다.

면 점은 설정부 상태의 반복,그것은 일반적으로 작성이 가능하 loop(중 하나를 사용하여 whilefor 에서)하는 방법으로 계속/종결 조건을 더 명시적으로 합니다.

(할 수 있는 경우 게시물에 대한 설명이 실제로 일어나는,그것이 뭔가를 쓰는 것으로 보이지 않는 임의의 위와 같.)

할 수 없습니다 밖으로 뛰어 두 개의 루프 단일 휴식을 명령하지만,당신이 사용할 수 있습 goto 에서 뛰어 내부 루프습니다.

면 goto 현지화,그 의미가 적은 논리보다 그렇지 않으면 그것을 생각하는 것은 완벽하게 허용 코드입니다.는 추가 깃발 변수,반복기를 게양하는 변수의 내부 루프를 비교할 수 있습니다 그래서 당신은 그것을 외부에서 반복하지 않을 이해하기 쉽게 코드는 설계되었습니다.

모든 위의 제안 내가 피를 사용하려고/catch 메커니즘이기 때문에 예외는 예약해야한 예외적인 상황에서,그리고 정상 제어 흐름입니다.

를 사용하여 두 나누기도 좋은지를 만들 수 있다면 두 번째 조건이 적절.를 사용하여 부울 이러한 목적으 것도 좋은,그리고 당신은 심지어는 와이어로 각각의 조건에 대한 반복입니다.예를 들어:

bool exit_loops = false;
for (int a = 0; a < A && !exit_loops; ++a)
{
    for (int b = 0; b < B && !exit_loops; ++b)
    {
        if (some_condition) exit_loops = true;
    }
}

하지만 경우에 당신을 사용하여 두 개 이상의 루프는 것이 더 적절할 수 있습니다 그들을 포장에서 기능 및 사용을 반환하는 함수를 종료하는 방법을 보여줍니다(그리고 모든 루프도).그런 다음 다시할 수 있습 리팩터 코드에서는 방법을 제거할 수 있는 모든 그러나 루프 중 하나,그것은 함수를 호출하여 수행 내부 루프 코드,등등.

마지막으로 두려워하지 않을 사용하여 goto 이 상황에서 일반적으로 고토의 나쁜 비구조적 프로그래밍하지만,일부 경우(이 같은)그들은 매우 유용합니다.

bool done = false;

for (int i = 0; i < maxi && !done; ++i)
    for (int j = 0; j < maxj && !done; ++j)
        if (i == 4 && i < maxi && j == 3 && j < maxj )
             done = true;
        else {
        }

또는 당신은 단지 goto.나지 않:-)

할 수 없습니다 밖으로 뛰어 이 같은 C/C++:

for (...)
{
  for (...)
  {
    // from here...
  }
}
// ...to here

를 사용하지 않고 강하게 어필하고 있다필요하신 생성 다음과 같:

for (...)
{
  bool
    exit = false;

  for (...)
  {
    if (do_exit)
    {
      exit = true; // or set outer loop counter to end value
      break;
    }
  }
  if (exit)
  {
    break;
  }
}

또는,사용하기-지만 쉽게 즐길 수 있기 때문에 던져 정말 위해 사용될 예외지 흐름을 제어합니다.

깨끗하는 방법을 확인하는 것입 안 루프 기능:

bool F ()
{
  if inner loop terminates, return false else return true
}

void G ()
{
  for (...)
  {
    if (!F ())
    {
      break;
    }
  }
}
for (int i = 0; i < maxi; ++i)
{
    int j = 0;
    for (j = 0; j < maxj; ++j)
    {
         if (i == 4 && j == 3) // i < maxi and j < maxj otherwise we would not be here
             break; // exit inner loop
    }
    if (i == 4 && j == 3) // i < maxi and j < maxj otherwise we would not be here
        break; // exit outer loop
}

당신이 사용할 수 있다 goto statement, 지만,일반적으로 간주 나쁜습니다.

다른 옵션은 다음과 같은 것이 가능합니다

int i;
int j = 0;
for (i = 0; i < maxi && !(i==4 && j==3); ++i)
    for (j = 0; j < maxj && !(i==4 && j==3); ++j)

읽기 코드가 되지 않을 읽기와 같은 형사 책(는 항상 필요했)...

예를 들어:

Java:

iterate_rows:
for (int i = 0; i < maxi; ++i)
{       
    for (int j = 0; j < maxj; ++j)
    {
        if (i == 4 < maxi && j == 3 < maxj) 
            break iterate_rows;
        else
            continue iterate_rows;
    }   
}

당신이 필요하지 않을 그림을 깰 iterate_rows,당신은 그냥 읽어 보시기 바랍니다.

C++:

//iterate_rows:
for (int i = 0; i < maxi; ++i)
{
    for (int j = 0; j < maxj; ++j)
    {
        if (i == 4 < maxi && j == 3 < maxj) 
            goto break_iterate_rows;
        else
            goto continue_iterate_rows;
    }

continue_iterate_rows:;
}
break_iterate_rows:;

goto break_iterate_rowsvisible휴식 iterate_rows

우 한정의 사용은 고토 및 라벨에 이런 종류의 코드만,당신이하지 않아도 있었습니다.의 사용을 제한 goto 및 라벨에 이런 종류의 코드를 만들 것입니다 당신은 코드를 읽고,없을 분석하거나 그것을 알아내는.당신은하지 않을 것이 혐의로 기소되는 악한 프로그래머입니다.

그리고 당신이 정말로 제한 gotos 에 이런 종류의 코드를 개발할 수 있는 습관을 필요로하지 않는 그 밖으로 사람들이 무슨 놈 gotos 에서 당신의 코드입니다.혜택을 추가할 필요가 없습을 소개하는 부울이고 그들을 추적하는(이럴 리드 검 코드, 만들고,그것은 조금 읽을 수 없는 패배의 목적은 피 gotos)

P.S.

쌍들 레이블과 코멘트(전에 반복),에 의해 시간을 읽인 고토로 문이 이미 알고 있의 의도를 사 gotos

나는 몇 가지 제안 사항:

  1. 니다....두 루프 안에"try{}"그리고"캐치""던"에서는 조건이 있습니다.

  2. 두 루프 메소드에서 반환에서는 조건이 있습니다.

  3. Goto 지 않는 악의 사용이 사람들을 넣어합니다....당신이 사용할 수 있습니다"고 수 있다"깨끗한 코드,특히 취급할 때에 오류가 있습니다.되지 않에서 20 년이다.

Tony

나는 항상 시도 멀리 떨어져 goto 표(그것은 항상 내려다 보았다 학교에서 나의 일을 위해 몇 가지 이유로).나는 다음과 같은 코드를 사용하면 어떤 Daemin 권장합니다.

당신이 사용할 수 있는 레이블,의 라인을 따라 뭔가:

Outer:
for(...)
{
    Inner:
    for(...)
    {
    if(condition)
        {
        goto End;
        }
    }
}
End:

자바에서 전달할 수 있습니다 레이블을 깰 나는 생각하십니까?

편집 변화 고토하여 최종보다는,외부 그러나 내가 생각하지 않는 부정적인 담당자가 정당화된다.이 대답은 간단한 방법으로 그것을 할 수 있습니다.

또 다른 이유에 대한 재검토서 for 생성을 완전히는 그것의 범위에 대한 액세스를 방지하는 통제한 후에는 변수는 루프가 종료되었습니다.Value(s)의 변수(s)되는 변화된 루프 수에 유용한 다양한 이유(예:구분 성공에서 실패에서 검색)그렇지 않으면 추가로 필요한 변수를 보존하는 정보를 후 범위에 종료됩니다.여기에 작은 예를 검색하는 사각 배열 이름 atarget 값(정 SIZE non-zero,그렇지 않으면 아무도 검색을 필요!):

int i = 0;
int j = 0;
while (i < SIZE && a[i][j] != target) { // still in array but not at target
    if (SIZE <= ++j) {                  // fallen off the end of a row
        j = 0;
        ++i;
    }
}

이후 코드를 사용할 수 있는 i < SIZE 는지 여부를 확인하고 원하는 값이었습니다.

의 또 다른 장점은 상기의 유연성이다.가 우리는 이제 정보는 값에서의 행 a 오,그래서 그의 나머지 부분은 줄이 없는 경우에는 보다 큰 값이 target 이 발생했습니다.그것은 쉽게 알 수 있을 정확히 어떤 변화를 만들고 있습니다.기 때문에 새로운 정보할 수 있게 포기하는 현재의 행만,내 결정에 영향을 되기:

    if (target < a[i][j] || SIZE <= ++j) { // can't be in row or fallen off end
    ...

나는 새로운 언어를(특히 기능적 중심의 것)포기하는 오래된"세"loop 구조;좋은 것,그것이 우리를 권장합에 대해 생각하기 의 반복이 아닌 단순히 계산합니다.

최선의 방법은 내가 본 을 포함한 매크로 gotos 지만,그것은 실제로 매우 좋은(연결후으로 시작한 이야기에 대해 펄지만,마지막 단락 또는 그렇게 소개합니다 macros).

그것은 당신이 쓰는 다음과 같은 코드:

named (LOOPS) for (i=1; i<10; i++) {
    for (j=1; j<10; j++) {
        for (j=1; j<10; j++) {
            /* Process data[i][j][k] here */
            if (data[i][j][k] < threshold) break(LOOPS);
        }
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top