내부에“break”가있는“while (true)”루프의 용어는 무엇입니까? [닫은]


24

C ++ 또는 C #에 다음과 같은 루프가 있다고 가정하십시오.

while( true ) {
    doSomething();
    if( condition() ) {
        break;
    }
    doSomethingElse();
}

이것을 일반적으로 "무한 루프"라고합니다. 그러나 기술적으로 무한하지는 않습니다 break. 일단 제어가 통과되면 중단됩니다 .

"루프 영원히"루프 제어문과 "중단"이있는 루프의 용어는 무엇입니까?


22
나는 특별한 용어가 없다고 생각합니다.
ChrisF

2
제어가 중단 될 것이라는 보장이 있습니까? 이 예에서 condition()항상 false를 반환 하면 어떻게 됩니까? 조건부 나누기가있는 무한 루프라고 말하고 싶습니다.
JohnL

1
이 없어도 break루프는 무한하지 않습니다 ( kill, ctrl-alt-del, unplug ...). 그렇다면 왜 용어 세부 사항을 신경 쓰지 않습니까?
mouviciel

5
"용어는 무엇입니까?" - "이것은 일반적으로 무한 루프라고합니다". 그것이 바로 당신의 대답입니다. 당신은 분명히 그 용어에 만족하지 않지만 (자연) 언어가 묘사 적이라는 사실을 없애지 않습니다. "X의 용어"는 사람들이 사용해야하는 것이 아니라 사람들이 사용하는 것입니다.
MSalters

5
이 질문은 "이름 그 것"질문이기 때문에 주제가 아닌 것 같습니다. "문자 나 이야기로이 모호한 TV 쇼, 영화 또는 책을 식별하는 것"이 ​​나쁜 질문 인 것과 같은 이유로 "그 물건의 이름을 정하십시오"는 나쁜 질문입니다. 다른 사람을 도와주지 말고 다른 유형의 한계 질문을 할 수있는 문을 열어주십시오. 참조 : blog.stackoverflow.com/2012/02/lets-play-the-guessing-game
gnat

답변:


24

CS를 공부 하면서이 교수는 사전 검사 루프 ( while(cond) {}) 가 있다고 가르쳤습니다 . 사후 점검 루프 (do {} while(cond);) 및 중간 점검 루프. (이것을 영어로 잘못 번역했을 수도 있지만 아이디어가 생깁니다.)

C와 C ++에는 후자 (ISTR Ada with BICBW)가 없으므로 C와 C ++에서 해당 구문에 사용됩니다.


1
네, Ada는 이것을 가지고 있습니다 :loop ... exit when condition; ... end loop;
Keith Thompson

@ Keith : 확인 주셔서 감사합니다! 내가 Ada를 한 지 거의 20 년이 지났습니다.
sbi

1
그만한 가치가 있기 때문에 저는 20 년 이상 (그리고 그보다 더 오래 애용 한) 전문 프로그래머였으며 그런 용어를 들어 본 적이 없습니다.
offby1

번역과 관련하여- "pre"와 "post"가 사용될 때 "in"이 더 적합하다고 생각합니다 (예 : "preorder / postorder / inorder tree traversal").
Oak

1
내가 자랐던 용어는 "중반 출구 루프"였습니다. 중간 출구 루프를 명시 적으로 지원하여 두 가지 언어로 작업했습니다.
mjfgates

13

스탠포드 CS의 첫 번째 과정 ( Mehran Sahami의 프로그래밍 방법론 )은 이것을 루프 반이라고 합니다. 그리고 반드시 나쁜 프로그래밍 연습은 아닙니다. 사용자 입력을 수집하는이 예제를 고려하십시오 ( Roberts는이를 a-loop-and-a-half 라고 하는 Eric Roberts의 Java의 Art and Science 에서 가져옴 ).

prompt user and read in the first value
while (value != sentinel) {
    process the data value
    prompt user and read in a new value
}

그리고 동일한 코드가 중복 코드를 피하기 위해 루프와 반 아이디어를 사용하여 해결되었습니다 .

while (true) {
    prompt user and read in a value
    if (value == sentinel) break;
    process the data value
}

10

공식적인 이름이 없으면 깨진 루프 라고 부릅니다 . 루프 중간에서 중단이 거의 부정확하기 때문에이 용어의 모호성은 의도 된 것 goto입니다.


나는 goto보다 훨씬 나쁘다. 나는 루프에서 잘못 구성된 조건보다 고토를 보는 것이 훨씬 낫습니다.
Brian Knoblauch

14
@ 브라이언 무엇? '참'조건은 그것을 명백하게 만들고 그와 같은 루프는 실제로 일반적입니다. 예를 들어, 파일의 모든 줄을 목록에 추가하려면 줄을 읽거나 (무언가) 실패한 경우 중지 (조건이 깨졌을 경우), 그렇지 않으면 목록에 추가하고 반복 (무언가)해야합니다 그밖에).
Craig Gidney

7
루프 중간에 브레이크에 아무런 문제가 없습니다. 사이클을 시작할 때마다 일부 작업을 수행해야하는 경우 코드를 복제하거나 이러한 작업을 조건에 포함시켜야합니다. 두 가지 변형 모두 분명히 단점이 있습니다. goto또한 C.에 차단 마지막으로 유효한 응용 프로그램, 시도의 예를 에뮬레이션했다 ...
말콤

1
Malcolm : 가능한 문제는 코드를 읽는 동안 루프가 종료되는시기와 이유를 찾기가 어렵다는 것입니다. 이러한 루프를 두 개 이상 중첩 할 때 내부 루프에서 찾은 조건에 따라 외부 루프에서 벗어나려는 경우 추가 문제점이 발생합니다.
user281377

하자 당신이 이벤트 루프 (의사 코드 :)에서처럼,으로 Xorg 응용 프로그램을 구동이 있다고 while(XEventGet(&ev) != NULL){ ... }, 당신은 자연스럽게 루프 내부의 키를 확인하고 싶은거야을 : if(ev.key == XK_q) break;. 다음을 수행하는 while(XEventGet(&ev) != NULL && ev.key != XK_q){ ... }것은 중간 루프 나누기보다보기 흉하고 읽기 어렵다. 또한 값을 확인하기 전에 먼저 값에 무언가를 수행해야하는 경우 어떻게해야합니까? 루프의 기본 케이스에 모든 것을 심각하게 넣지 않을 것입니다.
Braden Best

8

명확한 이름이 없습니다. 무한 루프는 적절한 용어라고 생각합니다. 루프가 실제로 무한하지는 않지만, 브레이크를 포함하는 브랜치가 발생하지 않을 가능성이 있기 때문에 효과적으로 무한히 될 가능성이 있습니다.

누군가에게 "무한 루프를 만들고 조건 X에 브레이크를 사용하십시오"라고 말하면 그들이 무슨 뜻인지 알게 될 것입니다. 누군가가 코드를 검토하고 "무제한 루프가 마음에 들지 않는다"고 아무 말도하지 않으면 그들이 말하는 내용을 알 수 있습니다 (물론 둘 이상이 아닌 한).


1
무한 루프가 아닙니다. 일반 while루프와 마찬가지로 잘 정의 된 종료 조건 이 있으며 종료 증명 방법은 동일합니다 (단조 적으로 감소하는 메트릭을 찾는 것이 좋습니다).
Donal Fellows

8

조건이 잘못된 장소에 do-while 루프입니다.


2
예, 작성해야합니다. while (keep_going) {doSomething (); if (조건) {keep_going = 거짓; } else {doSomethingElse (); }}
Stephen Gross

10
그래서 ... 컴퓨터 과정을 가르치고 있고 이것을 설명하고 싶다면 "지금 우리는 조건이 잘못된 * do-while 루프에 대해 배울 것입니다." "? 그것은 이름이 아니라 종교적인 의견처럼 들립니다.
Bryan Oakley

5
@StephenGross 그 코드 스 니펫은 끔찍한 제안입니다. 리팩토링은 루프 정의에서 실제 조건을 넣어하거나 사용 break또는 continue. 모든 비용으로 센티넬 값을 피하십시오. 정신적으로 추적해야 할 또 다른 임의의 상태 일 뿐이므로 코드의 목적을 가장합니다.
Izkata

2
센티널 값은 지연됩니다.
Winston Ewert

2
단일 종료 Weenie 인 경우 -1입니다.
Donal Fellows

6

"무조건 부 점프"와 비슷한 "무조건 부 루프"에 투표했습니다 . 그것은 (무한 루프와는 달리) 거짓말하지 않고 무슨 일이 일어나고 있는지 (코드는 무조건 루프) 정확하게 보여줍니다.


1
그러나 종료 조건이 있습니다. 그 가운데 if/ break는 패턴의 일부입니다.
Donal Fellows

5

"루프 영원히"루프 제어문과 "중단"이있는 루프의 용어는 무엇입니까?

중단 조건이있는 무한 루프입니다.

나는 당신이 특별한 이름을주고 싶다면 무한 부분 루프 라고 부를 수 있다는 점에서 ammilind에 동의합니다.


1
전혀 무한하지 않다. 종료 조건이 확인되는 지점은 다른 위치에 있습니다.
Donal Fellows

5

Rosetta 코드에서이 특정 패턴은 "N + 1/2"루프 로 설명됩니다 . 내가 가장 좋아하는 용어는 아니지만 끔찍하지 않으며 분명히 어떤 종류의 루프에 유용한 패턴입니다. (대체 조건은 실제 프로그램에서 까다로울 수있는 조건 전 코드를 복제하거나 루프 조건 변수를 추가하는 동안 조건 후 코드의 중첩 깊이를 늘리는 것입니다. 코드의 유지 관리 성 또는 이해도를 향상시키지 않습니다. 이러한 구조를 거부하는 유일한 이유는 루프 작성이 break자유 롭다 는 주장입니다 .)


4

표준 용어는 없지만 Partial loop 라고 부릅니다 .

이 루프는 마지막으로 루프의 일부를 한 번만 실행 한 후 (예 : 부분 실행) 중단하려는 경우에 사용됩니다 . 전체 루프 를 중단하려는 적절한 상황을 찾지 못할 때 사용됩니다 .

이 경우 최소한 doSomething()마지막으로 한 번 실행 한 후에 루프를 중단하려고합니다 .


2

나는 여기에 sbi에 동의해야한다-나는 중간 검사 루프 용어를 좋아한다 . 이러한 종류의 구조는 Structured Programming이 시작되고 많은 언어가 구문 지원을 할 때 더 많이 사용되었습니다.

즉, while불변에 대해 추론하기가 쉽고 까다로운 빈 사례를 더 잘 처리하기 때문에 루프가 일반적으로 더 관리 가능 하다는 것이 널리 알려져 있습니다.

특별한 경우 루프는 다음과 같습니다.

for(; doSomething(), !condition(); doSomethingElse()){}

그래서 나는 break하나의 문장 doSomething이나 doSomethingElse여러 문장이 관련된 경우 에만 버전을 사용 하고 오히려 당신과 같이 별도의 함수에 넣지 않기를 원합니다.

즉, 루프가 (시작, 확인, 증분) 반복보다 복잡하면 루프를 더 간단한 것으로 리팩토링하는 것을 고려해야합니다.


1

우리가 이것에 대한 용어를 만들려고한다면, 아마도 :

탈출 가능한 루프


-1. 문제는 이름을 만드는 것이 아니라 일반적인 이름이 이미 존재하는지에 관한 것입니다. 또한 모든 루프는 "탈출 가능"하므로 특히 효과적인 이름은 아닙니다.
Bryan Oakley

@BryanOakley 무한 루프는 정의상 깨지지 않아야합니다. 나쁜 프로그래밍 외에는 이것에 대한 용어가 없어야합니다.
LarsTech


0

모든 경우에 그렇게 나쁘지는 않습니다. 특정 종류의 API로 이런 종류의 루프를 작성하고 있습니다. 예를 들어 루프 객체가 있고 다음과 같이 아주 깊은 조건을 확인해야한다고 가정 해보십시오.

while (loop
    .getAExecutionModelFactory()
    .getActiveXexecutor()
    .getYCancelModelHandler()
    .getCurrentHandler()
    .isCancelled()) {
        // ... do something with the current Handler ....
        loop = ..... // prepare for next loop
}

이제 모든 getXXX 메소드가 잠재적으로 널을 리턴 할 수 있다고 가정하십시오. 그러면 매우 복잡하고 읽을 수없는 부울 식을 작성하는 것이 여전히 가능합니다. 그리고 현재 핸들러 객체를 얻기 위해 거의 똑같이 다시 실행해야합니다. 그러한 경우에는 while (true)중단 된 루프 를 작성 하고 계속 하는 것이 더 쉽다는 것을 알았습니다 .

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