링크 된 기사는 확실히 Donald Knuth의 N + 1 / 2 루프에 대해 잘 알고 있습니다. C / C ++ / Java로 표현 :
for (;;) {
get next element;
if (at the end) break;
process the element;
}
파일에서 행이나 문자를 읽고 EOF에 도달했는지 테스트 한 다음 처리하는 데 유용합니다. 나는 패턴 for(;;)..if(..)break;
이 나에게 관용적 인 것처럼 보이는 것을 보는 데 너무 익숙합니다 . (저는 Literate Programming 책에서 재 인쇄 된 Knuth 기사를 읽기 전에이 기사 는 "wtf?"였습니다.)
Knuth는 키워드를 제안했습니다 loop/while/repeat
.
loop:
S;
while C:
T;
repeat
어디 S
와 T
0 개 이상의 일련의 명령문 장소 홀더, 그리고 C
부울 조건이다. S
명령문 이 없으면 while 루프가되고 T
명령문 이 없으면 do 루프가됩니다.
이 구문 자체는 0 개 이상의 while C
절 을 허용하여 일반화 할 수 있으므로 무한 루프를 표현하고 두 가지 검사가 필요한 좀 더 희귀 한 조건을 표현하는 데 적합합니다.
같은 기사에서 Knuth는 로컬 버전의 던지기 / 잡기 예외 (goto 사용의 대안)가 될 시그널링 메커니즘을 제안했습니다.
나를 위해? 나는 자바 내가 표현할 수 그래서, 꼬리 호출 최적화를 지원하고자하는 어떤 필요에 따라 일반 제어 구조를.
업데이트 : 많은 C / C ++ / Java 프로그래머가 다음 조건에서 임베디드 할당을 사용 하여이 문제를 해결한다는 것을 언급하지 않았습니다 while
.
while ((c = getc(f)) != -1) {
T;
}
시 크 누스의 구조에서 용어를 사용이 허용됩니다 S
및 C
하나의 표현으로 결합 할 수 있습니다. 어떤 사람들은 위의 내장 과제를보고 싶어하지 않는 반면, 어떤 사람들 break
은 for (;;)
위의 내용을보고 싶어하지 않습니다. 그러나 여러 명령문 이있는 경우와 같이 결합 할 수없는 경우 S
와 코드를 반복하지 않는 것이 유일한 대안입니다. 다른 대안은 단순히 코드 를 복제하는 것 입니다.C
S
for (;;)
S
S;
while (C) {
T;
S;
}
크 누스의 loop/while/repeat
대안이 훨씬 나아 보인다.