2011-02-06 8 views
7

Douglas Crockfod는 일반적으로 루프 내부의 continue을 리팩토링하는 것이 좋습니다.루프 내부에서 계속 계속해서 안 좋은 이유는 무엇입니까?

루프 내에서 계속해서 잘못된 것으로 간주되는 이유는 무엇입니까?

+0

는 참조 소스에 다시 언급 한이 (http://stackoverflow.com/ [while 루프 중첩에 계속] 질문/1133408/continue-in-nested-while-loops). C#에 한정된 것이 거의 없으며 거기에 제공된 답변 중 많은 부분이 우수합니다. –

답변

1

continue의 효과는 여하튼 루프의 시작 부분에 goto과 비교할 수 있습니다. 따라서 코드를 이해하기 어려워집니다 (예 : goto).

+7

-1'if (...) {...} ... '는 블록의 끝에'goto '와 다소 유사합니다. 진지하게, 'goto'의 특수한 경우와 닮은 것을 무의미하게 무시하는 것은 (예를 들어, 문제의 상위 레벨 제어 구조가 존재할 때 'goto'를 사용하는) 제어 할 수없는 구조의 심각한 남용만큼 해로울 수 있습니다. – delnan

+0

@delnan 아래쪽 조건부 분기와 위쪽 조건부 비 조건부 분기 간에는 상당한 차이가 있습니다. 복잡한 어셈블리 코드를 읽은 경우 이유를 알 수 있습니다. 즉,'goto '를 사용하는 것은 실제로 허용 될 수 있지만 조건부가 아닌 분기에만 적용될 수 있습니다. 디자인에 의해 깨어진'continue'와는 달리 항상 상향으로 분기합니다. 'continue '의 존재는 항상 잘못 작성된 루프의 표시이며, 그것을 사용하는 모든 루프는 더 나은 방법으로 다시 작성할 수 있습니다. – Lundin

7

continue을 사용하면 while에 기록 된 조건이 충분하지 않다는 것을 의미합니다.

대신 while 루프 내에 if을 사용하거나 루프를 while 루프에 추가해야합니다.

+2

+1 *이 명령은 '계속'(대부분의 경우 *, 항상이 아닌 *)을 피할 수있는 유일한 이유입니다. – delnan

+0

-1 "만약'''이 더 좋다 ''라고 말하면, 전혀 대답하지 않습니다. – twiz

4

goto를 사용하면 루프 본문 내에서 중단, 중단, 계속 실행, throw 또는 반환하는 것이 모두 바람직하지 않은 효과를 가질 수 있습니다. 다음은 루프 컨트롤과 루프 바디가 밀접하게 짜여진 또 다른 예제입니다. 이전과 같이 1, 2 및 3을 씁니까? 확실합니까?

int value = 1; 
    for (;;++value) 
    { 
     cout << value << endl; 
     if (value != 4) 
      continue; 
     else 
      break; 
    } 

루프 바디 안에 return 문을 사용하지 말라고 조언하는 것이 열광적이라고 생각할 수 있습니다. 나는 그것을 정말로 의미합니까? 네 저도 그렇습니다. 무언가를 반환하는 함수는 함수의 맨 마지막에있는 단일 return 문을 통해 수행해야합니다.

Link

부인 성명 : : 여기 왜 어떤 실제적인 이유가 아니 내 소재, 내가

관련 문제