“while (true)”루프가 그렇게 나쁩니 까? [닫은]


218

저는 몇 년 동안 Java로 프로그래밍을 해왔지만 최근에 정규 학위를 받기 위해 학교로 돌아 왔습니다. 마지막 과제에서 아래의 루프와 같은 루프를 사용하면 포인트를 잃어 버렸다는 사실에 놀랐습니다.

do{
     //get some input.
     //if the input meets my conditions, break;
     //Otherwise ask again.
} while(true)

이제 테스트를 위해 콘솔 입력을 스캔하고 있지만 사용 break이 비슷하기 때문에 이런 종류의 루프는 권장하지 않는다는 말을 들었 goto습니다.

나는 함정 goto과 그 자바 사촌을 완전히 이해 하고 있으며 break:label, 그것을 사용하지 않는 것이 좋습니다. 또한 더 완전한 프로그램이 다른 탈출 수단을 제공한다는 것을 알고 있습니다.

무슨 일이야 do-while(true)?


23
선생님에게 물어보십시오. 그런 종류의 물건은 꽤 주관적입니다.
Chris Eberle

18
이 기사 가 goto에 해로운 것을 이해 하는 데 도움이된다는 것을 알았습니다 . 와의 비교 break는 아마도 의미가 있지만 실제로는 오해입니다. 아마도 당신은 이것에 대해 당신의 교수를 교육 할 수 있습니다;) 내 경험에서 교수들은 프로그래밍 기술에 대해 많이 알지 못합니다.
Magnus Hoff

100
이것에 대해 유일하고 논쟁의 여지가없는 것은 내 마음에 있습니다. 사실 과 do {} while (true)동등한 while(true) {}것은 후자의 형식과 훨씬 더 분명합니다.
Voo

11
누구나의 단순한 표현력을 이해하지 못하면 break언어가없는 언어로 프로그래밍해야합니다. 당신이 그것을 원하기 전에 너무 많은 루프를하지 않습니다!
Steven

16
숙제 태그에 동의하지 않습니다.
aaaa bbbb

답변:


220

나는 그것이 나쁘지 않다고 말하지 않을 것입니다 -그러나 마찬가지로 나는 대체로 적어도 대안을 찾습니다.

그것이 내가 쓰는 첫 번째 상황 인 경우, 나는 거의 항상 그것을 더 명확한 것으로 리팩토링 하려고 시도 합니다. 때로는 도움이되지 않을 수도 있습니다 (또는 대안은 bool루프의 끝을 나타내지 않고 의미가없는 변수 를 갖는 것 break입니다.)

break플래그보다 사용하기 쉬운 곳의 예로 다음을 고려하십시오.

while (true)
{
    doStuffNeededAtStartOfLoop();
    int input = getSomeInput();
    if (testCondition(input))
    {
        break;
    }
    actOnInput(input);
}

이제 플래그를 사용하도록하겠습니다 :

boolean running = true;
while (running)
{
    doStuffNeededAtStartOfLoop();
    int input = getSomeInput();
    if (testCondition(input))
    {
        running = false;
    }
    else
    {
        actOnInput(input);
    }
}

나는 후자를 읽기가 더 복잡하다고 생각합니다 : 여분의 else블록이 있고, actOnInput들여 쓰기가 더되며 , testCondition반환 할 때 발생하는 일을 해결하려는 경우 true블록의 나머지 부분을주의 깊게 살펴보고 거기에 있는지 확인해야합니다. 뭔가가 아니다else 여부를 발생할 수있는 블록 running으로 설정되어 false여부.

break진술은 의도를보다 명확하게 전달하고 나머지 블록은 이전 조건에 대해 걱정하지 않고 필요한 작업을 수행 할 수 있도록합니다.

이것은 사람들이 메소드에서 여러 개의 return 문에 대해 갖는 것과 동일한 종류의 인수입니다. 예를 들어, 처음 몇 줄 내에서 메소드의 결과를 계산할 수있는 경우 (예 : 일부 입력이 null이거나 비어 있거나 0 인 경우) 결과를 저장할 변수를 갖는 것보다 해당 답변을 직접 반환하는 것이 더 명확합니다. 그런 다음 다른 코드의 전체 블록과 마지막 으로 return명령문.


3
나는 그것이 내가 도달하는 첫 번째 도구가 아니라는 것에 동의하지만 문제를 너무 깨끗하게 처리하는 것처럼 보였고 깨끗한 코드를 좋아합니다.
JHarnach

3
@ X- 제로 : 가끔 그렇습니다. "break"를 "return"으로 바꿀 수 있다면 그것은 종종 선한 일입니다 ... 비록 당신은 여전히while (true)
Jon Skeet

21
@ trutheality : 나는 대부분의 코드가 가능한 한 들여 쓰기되지 않는 것을 선호합니다. 그리고 복합 과제가있는 조건은 나에게 더 복잡하다고 느낍니다.
Jon Skeet

3
@Vince : 그렇습니다 . 루프가 시작될 때 조건을 쉽게 표현할 수 있다면 좋습니다 . 그러나 때때로 당신은 할 수 없습니다-그것은 우리가 이야기하는 상황입니다. 내 대답의 첫 두 문장을 참고하십시오.
Jon Skeet

6
@Ismail : 그렇지 않길 바랍니다. 게시물은 저자가 아닌 내용으로 만 판단해야합니다. 에릭 리퍼 (Eric Lippert)의 게시물이 부정확하거나 도움이되지 않았다고 생각되면 공감할 것입니다. 그것은 아직 일어나지 않았습니다 :)
Jon Skeet

100

AFAIK 아무것도 아닙니다. 교사는에 대한 알레르기가 있습니다 goto. 왜냐하면 어딘가 나쁜 소식을 들었 기 때문입니다. 그렇지 않으면 다음과 같이 작성합니다.

bool guard = true;
do
{
   getInput();
   if (something)
     guard = false;
} while (guard)

거의 같은 것입니다.

어쩌면 이것은 더 깨끗합니다 (모든 반복 정보가 블록의 상단에 포함되어 있기 때문에) :

for (bool endLoop = false; !endLoop;)
{

}

4
종료 조건이 훨씬 더 눈에 띄기 때문에 귀하의 제안을 좋아합니다. 즉, 코드를 읽을 때 수행하려는 작업을 더 빨리 이해하게됩니다. 나는 무한 루프를 사용하지 않지만 두 버전을 자주 사용합니다.
Sled

4
합의는 깃발이 의도를 표현하기 때문에 크게 깨는 것보다 낫다는 것입니다. 나는 그것이 유익하다는 것을 알 수 있습니다. 모든 확실한 대답이지만 이것을 승인 된 것으로 표시합니다.
JHarnach

20
이 두 가지 모두 여전히 루프 가 깨 졌다는 것을 알고 있더라도 루프 몸체의 끝까지 계속 가야하므로 나머지 루프가 오염되는 경우가 있습니다 (최소한 상황에서) . 대답에 예를 들어 보겠습니다.
Jon Skeet

8
Jon Skeet의 답변이 더 좋습니다. 또한, (true) {}가 {}보다 훨씬 낫다. while (true)
aaaa bbbb

1
Dijkstra가 GoTo 기사를 쓴 적이 싫습니다. GoTo가 과거에 종종 악용되었다고해서 절대 사용해서는 안된다는 의미는 아닙니다. 또한 Exit For, Break, Exit While, Try / Catch는 모두 특수화 된 형태의 Goto입니다. Goto는 종종 코드를 더 읽기 쉽게 만들 수 있습니다. 그리고 네, Goto 없이는 아무것도 할 수 없다는 것을 알고 있습니다. 그렇다고해서 그런 의미는 아닙니다.
Kibbee

39

Douglas Crockford는 JavaScriptloop구조가 포함 되기를 원하는 방식에 대해 언급했습니다 .

loop
{
  ...code...
}

그리고 나는 Javaloop구조 를 갖는 데 더 나쁜 것이라고 생각하지 않습니다 .

while(true)루프에는 본질적으로 아무런 문제가 없지만 교사 루프 를 방해하는 경향이 있습니다. 교수의 관점에서 볼 때 학생들이 끝없는 루프를 만들고 루프가 탈출하지 않은 이유를 이해하게하는 것은 매우 쉽습니다.

그러나 그들이 거의 언급하지 않는 것은 모든 루핑 메커니즘이 while(true)루프 로 복제 될 수 있다는 것 입니다.

while( a() )
{
  fn();
}

와 같다

loop
{
  if ( !a() ) break;
  fn();
}

do
{
  fn();
} while( a() );

와 같다:

loop
{
  fn();
  if ( !a() ) break;
}

for ( a(); b(); c() )
{
  fn();
}

와 같다:

a();
loop
{
  if ( !b() ) break;
  fn();
  c();
}

사용하도록 선택한 구문이 작동 하는 방식으로 루프를 설정할 수있는 한 중요하지 않습니다. 이 경우 발생 에 맞게 for루프하는을 사용for 루프를.

마지막 부분 : 루프를 단순하게 유지하십시오. 반복 할 때마다 많은 기능이 필요한 경우 기능에 넣으십시오. 작동 후에는 항상 최적화 할 수 있습니다.


2
+1 : 명령문이 포함될 for때 루프 와 continue관련된 추가 복잡성이 있지만 주요 확장이 아닙니다.
Donal Fellows

나는 일반적으로 실행하려는 시퀀스가있을 때 for 루프를 사용하고 충족시키고 싶은 조건이있을 때 while 루프를 사용합니다. 이렇게하면 코드를보다 읽기 쉽게 유지할 수 있습니다.
dascandy

4
아무도 for (;;) {더 이상 쓰지 않습니까? ( "영원히"로 발음). 이것은 매우 인기가있었습니다.
Dawood ibn Kareem

16

1967 년에 Edgar Dijkstra는 무역 잡지에 기사를 작성하여 코드 품질을 향상시키기 위해 고급 언어에서 goto를 제거해야하는 이유를 설명했습니다. "구조적 프로그래밍"이라고하는 전체 프로그래밍 패러다임은 이것에서 나온 것이지만 모든 사람이 자동으로 잘못된 코드를 의미한다고 동의하는 것은 아닙니다.

구조적 프로그래밍의 요점은 본질적으로 코드 구조가 가능한 한 흐름을 결정하거나 중단하지 않고 흐름을 결정해야한다는 것입니다. 마찬가지로 패러다임에서는 루프 나 함수에 여러 개의 진입 점과 출구 점이있는 것도 권장하지 않습니다.

분명히 이것이 유일한 프로그래밍 패러다임은 아니지만 종종 객체 지향 프로그래밍 (ala Java)과 같은 다른 패러다임에 쉽게 적용될 수 있습니다.

귀하의 교사는 아마도 가르쳐 졌을 것입니다. 그리고 코드를 체계화하고 구조화 된 프로그래밍의 암묵적인 규칙을 준수하여 "스파게티 코드"를 피하는 것이 가장 좋습니다.

break를 사용하는 구현에는 본질적으로 "잘못"된 것이 없지만 while () 조건 내에 루프 조건이 명시 적으로 지정되어 지나치게 까다로울 수있는 가능성을 제거하는 코드를 읽는 것이 훨씬 쉽다고 생각하는 사람들도 있습니다. 실수로 무한 루프를 생성하거나 읽기가 어렵거나 불필요하게 혼동되는 코드를 만드는 위험과 같은 초보 프로그래머가 코드에 자주 나타나는 것처럼 보이는 while (true) 조건을 사용하는 데에는 분명히 함정이 있습니다.

아이러니하게도 예외 처리는 구조적 프로그래밍과의 편차가 확실하게 나타나고 Java 프로그래밍에 더 나아갈 때 예상되는 영역입니다.

또한 강사는 해당 장 또는 텍스트 레슨에서 가르치는 특정 루프 구조 또는 구문을 사용하는 능력을 보여줄 것으로 예상했을 수도 있으며, 작성한 코드는 기능적으로 동일하지만 그 레슨에서 배웠어야했던 특정 기술.


2
Edsger Dijkstra의 논문 은 다음과 같습니다 . 잘 읽었습니다.
Roy Prins

14

입력을 읽기위한 일반적인 Java 규칙은 다음과 같습니다.

import java.io.*;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String strLine;

while ((strLine = br.readLine()) != null) {
  // do something with the line
}

그리고 입력을 읽는 일반적인 C ++ 규칙은 다음과 같습니다.

#include <iostream>
#include <string>
std::string data;
while(std::readline(std::cin, data)) {
  // do something with the line
}

그리고 C에서는

#include <stdio.h>
char* buffer = NULL;
size_t buffer_size;
size_t size_read;
while( (size_read = getline(&buffer, &buffer_size, stdin)) != -1 ){
  // do something with the line
}
free(buffer);

또는 파일에서 가장 긴 텍스트 줄이 얼마나 긴지 알고 있다면

#include <stdio.h>
char buffer[BUF_SIZE];
while (fgets(buffer, BUF_SIZE, stdin)) {
  //do something with the line
}

사용자가 quit명령을 입력했는지 여부를 테스트하는 경우 이러한 3 가지 루프 구조를 쉽게 확장 할 수 있습니다. 나는 당신을 위해 자바로 할 것입니다 :

import java.io.*;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;

while ((line = br.readLine()) != null  && !line.equals("quit") ) {
  // do something with the line
}

따라서 확실히 break또는 goto정당화 되는 경우가 있지만 파일이나 콘솔에서 한 줄씩 읽는 것이면 while (true)루프를 수행 할 필요가 없습니다. 프로그래밍 언어가 이미 제공 한 것입니다 입력 명령을 루프 조건으로 사용하기위한 적절한 관용구.


사실, while (true)이러한 기존 입력 루프 중 하나 대신 루프를 사용하는 경우 파일 끝을 확인하는 것을 잊어 버릴 수 있습니다.
Ken Bloom

3
루프의 첫 번째 부분을 while조건부 로 채워서 효과적으로 수행합니다 . 최종 Java 조건에서는 이미 상당히 무겁고 계속 진행할지 여부를 결정하기 위해 광범위한 조작을 수행 해야하는 경우 시간이 오래 걸릴 수 있습니다. 별도의 기능으로 나눌 수 있으며 가장 좋습니다. 그러나 하나의 기능으로 원하는 경우 계속할지 여부를 결정하기 전에해야 할 사소한 작업 while(true)이 있다면 가장 좋습니다.
poolie

@poolie : 그렇다면 read 명령을 루프 조건 (EOF를 확인)으로 사용하고 루프 내 다른 조건을 break 문으로 확인하는 것이 가장 좋습니다.
Ken Bloom

1
가치있는 gets()것은 일반적인 관습이 아닙니다. 버퍼 오버 플로우에 매우 도움이됩니다. fgets(buffer, BUFFER_SIZE, file)표준 연습과 훨씬 비슷합니다.
Dave

@Dave : 이제 사용할 답변을 편집했습니다 fgets.
Ken Bloom

12

그렇게 끔찍한 것은 아니지만 코딩 할 때 다른 개발자를 고려해야합니다. 심지어 학교에서도.

동료 개발자는 루프 선언에서 루프의 exit 절을 볼 수 있어야합니다. 당신은 그렇게하지 않았습니다. 루프 중간에 exit 절을 숨겨서 코드를 이해하려고 시도하는 다른 사람을 위해 더 많은 작업을 수행합니다. 이것이 "break"와 같은 것을 피하는 것과 같은 이유입니다.

즉, 실제 세계의 많은 코드에서 여전히 이와 같은 것을 볼 수 있습니다.


4
루프가 시작되면 내부 또는 내부에 있거나 또는 영원히 실행될 것이라는 것이 while (true)명백합니다 . 솔직한 것이 중요하지만 그 자체로는 특히 나쁘지는 않습니다. 루프 반복에서 복잡한 불변 값을 갖는 변수는 훨씬 더 성가신 원인의 예입니다. breakreturnwhile(true)
poolie

4
검색에서 3 단계 깊이 들어가서 어떻게 든 해보십시오. 그 시점에서 돌아 오지 않으면 코드가 훨씬 나빠질 것입니다.
dascandy

11

총, 총알, 발입니다.

당신이 문제를 요구하기 때문에 나쁘다. 짧거나 단순한 while 루프 예제가있는이 페이지의 사용자 나 다른 포스터는 아닙니다.

문제는 앞으로 매우 임의의 시간에 시작됩니다. 다른 프로그래머가 원인 일 수 있습니다. 소프트웨어를 설치 한 사람 일 수 있습니다. 최종 사용자 일 수 있습니다.

왜? 700K LOC 앱이 모든 CPU가 포화 될 때까지 점차적으로 CPU 시간의 100 %를 레코딩하기 시작하는 이유를 찾아야했습니다. 그것은 놀라운 while (true) 루프였습니다. 크고 불쾌했지만 다음과 같이 정리했습니다.

x = read_value_from_database()
while (true) 
 if (x == 1)
  ...
  break;
 else if (x ==2)
  ...
  break;
and lots more else if conditions
}

마지막으로 다른 지점은 없었습니다. 값이 if 조건과 일치하지 않으면 루프는 시간이 끝날 때까지 계속 실행됩니다.

물론 프로그래머는 최종 사용자가 프로그래머가 예상 한 값을 선택하지 않았다고 비난했습니다. 그런 다음 코드에서 while (true)의 모든 인스턴스를 제거했습니다.

IMHO while (true)와 같은 구문을 사용하는 것은 방어적인 프로그래밍이 아닙니다. 당신을 괴롭히기 위해 다시 올 것이다.

(그러나 i ++의 경우에도 모든 줄을 언급하지 않으면 교수들이 등급을 매기는 것을 기억합니다.)


3
방어 프로그래밍에 대한 설명은 +1입니다.
JHarnach

3
귀하의 예에서 코드는 while (true)의 선택 때문이 아니라 코드 주위에 루프를 배치한다는 생각 때문에 어리 석습니다.
Florian F

실제로, 그 루프의 요점은 무엇입니까? :)
juzzlin

6

구조화 된 프로그래밍 구조는 (구조화되지 않은) break 및 continue 문보다 선호된다는 점에서 나쁩니다. 이에 비해이 원칙에 따라 "goto"보다 선호됩니다.

Jon Skeet이 지적했듯이 코드를 최대한 구조화하지는 않지만 항상 가능한 한 체계적으로 코드를 작성하는 것이 좋습니다.


5

내 경험에 따르면 대부분의 경우 루프는 "주요"상태를 유지합니다. 이것은 while () 연산자 자체에 작성해야하는 조건입니다. 루프를 깨뜨릴 수있는 다른 모든 조건은 부차적이며 중요하지는 않습니다 if() {break}. 추가 진술 로 작성할 수 있습니다 .

while(true) 종종 혼란스럽고 읽기 쉽지 않습니다.

나는이 규칙들이 100 %의 경우를 다루지는 않지만 98 %의 경우에만 적용한다고 생각합니다.


잘했다. while (true) {i ++; ...}와 함께 for 루프를 사용하는 것과 같습니다. 당신은 '서명'이 아닌 루프 안에 루프 조건을 묻습니다.
LegendLength

3

왜 사용하지 않는지에 대한 대답 while (true)은 아니지만, 나는 항상 이 만화와 함께 나오는 저자의 진술 을 왜하지 않고 왜해야하는지에 대한 간결한 설명을 찾았습니다 .

귀하의 질문과 관련하여 다음과 같은 고유 문제가 없습니다.

while(true) {
   do_stuff();
   if(exit_time) {
      break;
   }
}

... 경우에 당신은 당신이 일을하고 있는지 만들고있어 알고 exit_time어떤 점에서 의지가 평가 true.

선생님 while(true)은 자신이하고있는 일을 정확히 알고있을 때까지는 중대한 실수를 저지르기 쉬운 방법이기 때문에 사용 하지 않는 것이 좋습니다.


나는 설정을 생각 exit_time = false; while(!exit_time) { execute_stuff(); }하고 do { execute_stuff(); } while(! exit_time );모두 if( condition ) { break; }루프 끝에서를 갖는 것보다 훨씬 명확 합니다 while(true). 브레이크는 루프에 대한 단락입니다. 루프 중간에서 단락으로 사용될 때 완벽하게 괜찮습니다.하지만 while 문의 조건과 루프 끝에서 중단을 평가하면됩니다.
jimbob 박사

그 만화와 관련하여 : do-while은 할 수있는 모든 것을 할 수 없지만, do-while은 할 수있는 일도 할 수있는 일을하는 것이 더 낫습니다.
Theraot

3

부울 플래그를 사용하여 while 루프를 종료 할시기를 나타낼 수 있습니다. Breakgo to 소프트웨어 위기 (TM) - - 유지하기 위해 하드에있는 소프트웨어에 대한 이유가 있었다 피해야한다, 및도 쉽게 할 수 있습니다.

실용적이든 아니든 문제입니다. 실용적인 코더는 단순한 상황에서 중단을 사용할 수 있습니다.

그러나 habbit를 사용하지 않는 것이 좋습니다. 그렇지 않으면을 사용하여 코드의 가독성과 유지 관리가 어려워지는 복잡한 중첩 루프와 같이 부적절한 상황에서 habbit에서 사용할 수 있습니다 break.


8
부울 플래그를 유지하는 것이 아마도 더 명확하지 않고 내 경험상 명확 할 수 있습니까?
Jon Skeet

3
@ Jon Skeet 글쎄, 좋은 습관을 가지거나 휴식을 통해 나쁜 사람을 훈련시키는 문제입니다. "달리기"라는 부울이 확실하지 않습니까? 그것은 분명하고 디버깅하기 쉽고, 좋은 습관을 유지하기 전에 언급 한 바와 같습니다. 문제는 어디에 있습니까?
Daniel Leschkowski

4
그 실행라는 부울 그런 다음이 나를 필요로 if (running)내가 원하는 모든 루프를 종료 할 때 확실히 모든 코드의 나머지 부분을 들여 쓰기, 루프 내에서 적은 내용의 간단한 break 문을보다 명확 나에게 정확히 내가 원하는. 당신은 나쁜 습관으로 브레이크 사용을 고려하는 것 axiomatically - 나는 같은 그것을 생각하지 않습니다.
존 스키트

2
루프 내에서 if (실행)하는 이유는 무엇입니까? 루프 끝에서 break와 마찬가지로 break를 사용하는 대신 플래그를 분리하고 뒤집을 지 확인하고 while (true) 대신 while (running)에 플래그를 사용하십시오. 나는 당신의 요점을 진지하게 생각하지 않습니다. 나는 실용적인 상황에서 코더가 특정 상황에서 중단을 사용할 수 있다는 데 동의하지만 내 제안에 따라 작성한 의견을 실제로 얻지
못합니다.

3
종료 여부를 결정한 후 루프 내에서 아무것도 할 필요가 없다고 가정합니다. 예를 들어, OP의 상황에서 그는 종료하지 않으면 더 많은 정보를 요구해야합니다.
Jon Skeet

3

아마 운이 좋지 않을 수도 있습니다. 아니면 경험이 부족할 수도 있습니다. 하지만 상대 해낸다마다 while(true)갖는 break내부, 상기 도포 코드 향상시킬 수 있었다 추출 방법잠시 블록 유지, while(true)모든 변형되지만 (우연히?) break로 (S) return들.

내 경험에 while(true)의하면 휴식없이 (즉, 반품이나 던지기 등) 매우 편안하고 이해하기 쉽습니다.


  void handleInput() {
      while (true) {
          final Input input = getSomeInput();
          if (input == null) {
              throw new BadInputException("can't handle null input");
          }
          if (input.isPoisonPill()) {
              return;
          }
          doSomething(input);
      }
  }

3

나는 그렇습니다. 많은 개발자에게는 적어도 나쁘다고 생각합니다. 루프 조건을 생각하지 않는 개발자에게는 증상이 있습니다. 결과적으로 오류가 발생하기 쉽습니다.


2

아무 큰 문제가 없습니다 while(true)와 함께break 문 그러나 일부는 약간의 코드의 가독성을 절감 생각할 수 있습니다. 변수에 의미있는 이름을 부여하고 적절한 위치에서 표현식을 평가하십시오.

예를 들어, 다음과 같은 작업을 수행하는 것이 훨씬 더 명확 해 보입니다.

do {
   input = get_input();
   valid = check_input_validity(input);    
} while(! valid)

do while 루프가 길어지면 특히 그렇습니다. 추가 반복이 발생하는지 확인하는 위치를 정확하게 알고 있습니다. 모든 변수 / 함수는 추상화 레벨에서 적절한 이름을 갖습니다. 그만큼while(true)문은 처리가 당신이 생각하는 장소에없는 말씀입니다 않습니다.

루프를 통해 두 번째로 다른 출력을 원할 수도 있습니다. 같은 것

input = get_input();
while(input_is_not_valid(input)) {
    disp_msg_invalid_input();
    input = get_input();
}

나에게 더 읽기 쉬운 것 같습니다

do {
    input = get_input();
    if (input_is_valid(input)) {
        break;
    }
    disp_msg_invalid_input();
} while(true);

다시 한번 간단한 예제를 통해 두 가지 모두 읽을 수 있습니다. 그러나 루프가 매우 크거나 깊게 중첩되면 (아마도 이미 리팩토링해야 함을 의미) 첫 번째 스타일이 약간 더 명확 할 수 있습니다.


1

나는 비슷한 기능을 사용하지만 많은 기능에서 반대 논리를 사용합니다.

DWORD dwError = ERROR_SUCCESS;

do
{
    if ( (dwError = SomeFunction()) != ERROR_SUCCESS )
    {
         /* handle error */
         continue;
    }

    if ( (dwError = SomeOtherFunction()) != ERROR_SUCCESS )
    {
         /* handle error */
         continue;
    }
}
while ( 0 );

if ( dwError != ERROR_SUCCESS )
{
    /* resource cleanup */
}

1

루프의 선언에서 루프가 멈추는 이유 를 명시 적으로 알 있는 코드를 읽기가 훨씬 더 미학적 인 것 입니다.


1

나는 그것이 좋은 생각으로 여겨지지 않는 이유는 일반적으로 당신이 그 구성을 최대한 활용하지 않기 때문이라고 말합니다. 또한 학생들이 "수하물"에 들어올 때 많은 프로그래밍 강사들이 그것을 좋아하지 않는다고 생각하는 경향이 있습니다. 그것은 그들이 학생들의 프로그래밍 스타일에 가장 큰 영향을 미친다고 생각합니다. 아마도 그것은 강사의 애완 동물 일뿐입니다.


1

나에게 문제는 가독성이다.

조건이 true 인 while 문은 루프에 대해 아무 것도 알려주지 않습니다. 그것은 이해하는 일을 훨씬 더 어렵게 만듭니다.

이 두 스 니펫에서 이해하기 쉬운 것이 무엇입니까?

do {
  // Imagine a nice chunk of code here
} while(true);

do {
  // Imagine a nice chunk of code here
} while(price < priceAllowedForDiscount);

0

선생님에게 휴식을 사용하는 것은 과일을 얻기 위해 나무 가지를 끊는 것과 같으며 과일을 얻고 가지가 여전히 살아 있도록 다른 속임수를 사용하십시오 (지점 활). :)


0

1) 아무 문제가 없습니다 do -while(true)

2) 선생님이 틀 렸습니다.

NSFS !! :

3) 대부분의 교사는 교사이며 프로그래머가 아닙니다.


@Connell 선생님이들을 때까지 기다리십시오!
Pacerier

1
나는 프로그래밍 분야에서 스스로 가르쳤다. 제가 판단해야 할 것은 중고등 학교의 IT 교사입니다. 그는 모든 것이 절대적으로 자리 잡은 방식으로 Dreamweaver를 사용하여 웹 사이트를 만들도록 가르쳐주었습니다.
Connell

@Connell 귀하의 동의를 보여주기 위해 게시물을 올리십시오
Pacerier

2
"할 수없는 사람들은 가르치십시오." -그건 꽤 큰 일반화라고 생각하지 않습니까? 의사, 엔지니어, 조종사 등은 모두 강사가 귀하에 따라 능력이 없어서 스스로 가르쳐야합니까?
filip-fku 4

@ filip-fku 와우 와우 ~ 멋져요!
Pacerier

0

루프가 백그라운드 스레드에서 실행되는 경우 나쁠 수 있으므로 UI ​​스레드를 종료하여 응용 프로그램을 닫을 때 해당 코드 조각이 계속 실행됩니다. 다른 사람들이 이미 말했듯이 항상 취소 방법을 제공하기 위해 일종의 검사를 사용해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.