C # 루프-중단 대 계속


797

C # (다른 언어에 대해서는 자유롭게 대답하십시오) 루프에서 루프의 구조를 벗어나고 다음 반복으로 이동하는 수단으로 break와 continue의 차이점은 무엇입니까?

예:

foreach (DataRow row in myTable.Rows)
{
    if (someConditionEvalsToTrue)
    {
        break; //what's the difference between this and continue ?
        //continue;
    }
}


8
continue;현재의 처리를 중지 하고 컬렉션 row에서 다음 처리를 계속 row합니다. 반면에 break;, foreach명령문을 완전히 남겨두고 나머지 행은 처리되지 않습니다.
Jeppe Stig Nielsen

답변:


1500

break완전히 루프를 종료합니다 continue단지 것이다 건너 뛸 현재 반복합니다.

예를 들면 다음과 같습니다.

for (int i = 0; i < 10; i++) {
    if (i == 0) {
        break;
    }

    DoSomeThingWith(i);
}

중단은 루프가 첫 번째 반복에서 종료되도록합니다 DoSomeThingWith. 절대 실행되지 않습니다. 여기에 :

for (int i = 0; i < 10; i++) {
    if(i == 0) {
        continue;
    }

    DoSomeThingWith(i);
}

실행하지 않음 DoSomeThingWith에 대한 i = 0,하지만 루프는 것이다 계속 하고 DoSomeThingWith위해 실행됩니다 i = 1i = 9.


2
왜 그들의 중괄호가 계속되지 않는가-나는 그것이없이 작동한다는 것을 알고 있지만 왜?
George Willcox

52
@GeorgeWillcox 젊고 어리석은 자아는 항상 중괄호 사용의 가치를 아직 배우지 못했습니다. (C #에서는 단일 명령문의 경우 선택 사항이지만이를 배치하지 않으면 나중에 버그를 쉽게 도입 할 수 있습니다. programmers.stackexchange.com/a/16530/6342 )
Michael Stum

386

이것을 이해하는 가장 쉬운 방법은 각 키워드 뒤에 단어 "loop"를 두는 것입니다. 용어가 일상적인 문구처럼 읽 히면 이제 의미가 있습니다.

break 루프-루핑이 끊어지고 중지됩니다.

continue loop-루프는 다음 반복에서 계속 실행됩니다.


105

break 는 프로그램 카운터가 가장 안쪽 루프의 범위를 벗어나게합니다.

for(i = 0; i < 10; i++)
{
    if(i == 2)
        break;
}

이런 식으로 작동

for(i = 0; i < 10; i++)
{
    if(i == 2)
        goto BREAK;
}
BREAK:;

루프의 끝으로 계속 점프합니다. for 루프에서 계속 증가 식으로 이동합니다.

for(i = 0; i < 10; i++)
{
    if(i == 2)
        continue;

    printf("%d", i);
}

이런 식으로 작동

for(i = 0; i < 10; i++)
{
    if(i == 2)
        goto CONTINUE;

    printf("%d", i);

    CONTINUE:;
}

2
여기서 많은 루프가 표준 for루프를 사용하지만 사전 및 사후 테스트 while루프에서 작동합니까? 이 goto표기법은 저를 믿게하지만 약간의 검증이 필요합니다.
Daniel Park

1
@Daniel, WHILE 루프의 경우 문제없이 BREAK 및 CONTINUE를 사용할 수 있습니다.
Amila

@DanielPark while( "pre-tested")와 do- while( "post-tested") 둘 다에 대해 , continue;명령문이 충족 된 후 다음에 일어날 일은 루프 조건이 평가되어 추가 반복이 수행 될 것인지를 결정하는 것입니다. 물론 break;루프 조건을 확인 하지 않으면 루프가 완전히 종료됩니다. 따라서 goto비유도이 측면을 이해하는 데 좋습니다.
Jeppe Stig Nielsen

37

나는 휴식을 계속해야하는지 아니면 계속해야하는지 항상 혼란스러워했습니다. 이것이 내가 기억하는 데 도움이되는 것입니다.

중단 대 계속 사용시기

  1. Break- 헤어지는 것과 같습니다. 슬프다. 너희들은 이별하고있다. 루프가 종료됩니다.

단절

  1. 계속 -오늘 휴식을 취하고 내일 모두 정리합니다 (즉, 현재 반복 건너 뛰기).

계속하다


이것을 내 파트너와 공유 할 것입니다. Continue의 이름은 GetOverIt으로, Break의 이름은 MoveOnForward로 변경해야합니다. 우리가 괴짜라고 불리는 것은 당연합니다. Break는 어떤 의미가 있습니까? 파괴적인 것 같습니다. 그리고 추가해야 할 것 중 하나는 STOP 또는 더 나은 EndIt입니다. 많은 버그를 수정하고 C-sharp를 선명하게 만듭니다.
Mike

다시 홍수로 같은 옛날 여행이 돌아 왔을 때 큰 실수를 저질렀습니다. 내 길을 한 번 보았습니다
Talal Zahid

@TalalZahid 이해가되지 않습니까?
BKSpurgeon

28

breakforeach루프를 완전히 멈추고 continue다음으로 건너 뜁니다 DataRow.


20

같이하지 않는 이상 몇 사람이있다 break하고 continue. 내가 본 최근 불만은 JavaScript : Douglas Crockford의 The Good Parts 입니다. 그러나 때로는 그중 하나를 사용하면 실제로 언어가 do-while또는do-until 루프의 스타일을.

나는 break무언가에 대한 목록을 검색하는 루프 에서 사용하는 경향이 있습니다 . 일단 발견되면 계속 진행할 점이 없으므로 종료 할 수도 있습니다.

나는 continue목록의 대부분의 요소로 무언가를 할 때 사용 하지만 여전히 몇 가지를 건너 뛰고 싶습니다.

break문장은 또한 누군가 또는 다른 사람으로부터 유효한 응답을 폴링 할 때 유용합니다. 대신에:

Ask a question
While the answer is invalid:
    Ask the question

중복을 제거하고 사용할 수 있습니다.

While True:
    Ask a question
    If the answer is valid:
        break

do-until내가 전에 언급 한 루프는 특정 문제에 대한 더 우아한 솔루션입니다 :

Do:
    Ask a question
    Until the answer is valid

복제도 break필요 없고 필요도 없습니다.


13

모두 매우 좋은 설명을했습니다. 도움이된다면 예제를 제공하기 위해 여전히 답변을 게시하고 있습니다.

// break statement
for (int i = 0; i < 5; i++) {
    if (i == 3) {
        break; // It will force to come out from the loop
    }

    lblDisplay.Text = lblDisplay.Text + i + "[Printed] ";
}

출력은 다음과 같습니다.

0 [인쇄] 1 [인쇄] 2 [인쇄]

따라서 i == 3 일 때 중단이 발생하므로 3 [Printed] & 4 [Printed]가 표시되지 않습니다.

//continue statement
for (int i = 0; i < 5; i++) {
    if (i == 3) {
        continue; // It will take the control to start point of loop
    }

    lblDisplay.Text = lblDisplay.Text + i + "[Printed] ";
}

출력은 다음과 같습니다.

0 [인쇄] 1 [인쇄] 2 [인쇄] 4 [인쇄]

따라서 i == 3 일 때 계속 진행되므로 3 [Printed]가 표시되지 않습니다.


7

단절

Break는 루프를 즉시 강제 종료합니다.

계속하다

이것은 휴식의 반대입니다. 루프를 종료하는 대신 나머지 코드는 건너 뛰고 즉시 다시 루프됩니다.


1
루프 상태도 계속 점검 :)
Grantly

1
Continue반대 아닌 break, break루프를 중지, continue현재 반복을 정지한다.
Steven

6

간단한 답변 :

브레이크 는 즉시 루프를 종료합니다. 다음 항목 처리를
계속 하십시오. (있는 경우, for / while의 평가 라인으로 이동하여)


6

예를 들어

foreach(var i in Enumerable.Range(1,3))
{
    Console.WriteLine(i);
}

1, 2, 3을 인쇄합니다 (별도의 줄에).

i = 2에서 중단 조건 추가

foreach(var i in Enumerable.Range(1,3))
{
    if (i == 2)
        break;

    Console.WriteLine(i);
}

이제 루프가 1을 인쇄하고 정지합니다.

중단을 계속으로 교체하십시오.

foreach(var i in Enumerable.Range(1,3))
{
    if (i == 2)
        continue;

    Console.WriteLine(i);
}

이제 인쇄물 1과 3을 반복합니다 (2 건너 뛰기).

따라서 break루프를 중지 continue하고 다음 반복으로 건너 뜁니다.


5

불행히도 루비는 조금 다릅니다. 추신 : 내 기억은 조금 흐릿합니다. 내가 잘못하면 사과합니다.

break / continue 대신 break / next가 있으며 루프 측면에서 동일하게 작동합니다.

루프는 다른 모든 것과 마찬가지로 표현식이며 마지막으로 수행 한 것을 "반환"합니다. 대부분의 경우 루프에서 반환 값을 얻는 것은 의미가 없으므로 모든 사람 이이 작업을 수행합니다.

a = 5
while a < 10
    a + 1
end

그러나 당신은 이것을 할 수 있습니다

a = 5
b = while a < 10
    a + 1
end # b is now 10

그러나 많은 루비 코드는 블록을 사용하여 루프를 '에뮬레이트'합니다. 정식 예는

10.times do |x|
    puts x
end

사람들이 블록의 결과로 일을하고 싶어하는 것이 훨씬 흔하기 때문에 여기가 지저분 해집니다. break / next는 블록의 맥락에서 다른 것을 의미합니다.

차단은 블록을 호출 한 코드에서 뛰어납니다

다음은 블록의 나머지 코드를 건너 뛰고 블록의 호출자에게 지정한 것을 '반환'합니다. 예가 없으면 의미가 없습니다.

def timesten
    10.times{ |t| puts yield t }
end


timesten do |x|
   x * 2
end
# will print
2
4
6
8 ... and so on


timesten do |x|
    break
    x * 2
end
# won't print anything. The break jumps out of the timesten function entirely, and the call to `puts` inside it gets skipped

timesten do |x|
    break 5
    x * 2
end
# This is the same as above. it's "returning" 5, but nobody is catching it. If you did a = timesten... then a would get assigned to 5

timesten do |x|
    next 5
    x * 2
end 
# this would print
5
5
5 ... and so on, because 'next 5' skips the 'x * 2' and 'returns' 5.

그래 루비는 훌륭하지만 끔찍한 코너 케이스가 있습니다. 이것은 내가 그것을 사용하는 내 년에 본 두 번째 최악입니다 :-)


5

분명한 내용을 말씀 드리겠습니다. 중단이나 계속을 추가하지 않으면 프로그램이 재개됩니다. 즉, 특정 오류에 갇힌 다음 기록 한 후 처리를 다시 시작하고 싶었고 다음 행 사이에 더 많은 코드 작업이 있었으므로 그냥 넘어지게했습니다.


3

foreach는 루프에서 완전히 끊으려면, 휴식이 사용된다

루프에서 다음 반복으로 이동하려면 계속 이 사용됩니다.

Break 는 Datatable의 Rows와 같은 Objects 컬렉션을 반복하고 특정 일치 항목을 검색하는 경우 해당 일치 항목을 찾을 때 나머지 행을 계속할 필요가 없으므로 유용합니다. 밖.

Continue 는 루프 반복에 필요한 것을 달성했을 때 유용합니다. 당신은 일반적으로 if 후에 계속 될 것 입니다.


2

break 를 사용하지 않으려면 반복 조건을 false로 만들고 다음 반복에서 루프가 실행되지 않도록 I의 값을 높이십시오.

for(int i = 0; i < list.Count; i++){
   if(i == 5)
    i = list.Count;  //it will make "i<list.Count" false and loop will exit
}

0

다른 언어들에 관해서는 :

'VB
For i=0 To 10
   If i=5 then Exit For '= break in C#;
   'Do Something for i<5
next

For i=0 To 10
   If i=5 then Continue For '= continue in C#
   'Do Something for i<>5...
Next
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.