왜 내가 많은 for (;;) 구문을보고 있습니까? [닫은]


14

내 생각에, for 루프는 알려진 또는 결정 가능한 범위를 반복하는 데 사용됩니다.

String[] names = //something;
for ( int i = 0; i < names.length; i++ ) { //do stuff }

이는 다음과 같습니다 (i의 범위를 제외하고).

String[] names = //something;
int i = 0;
while (i < names.length )
{
   // do stuff
   i++;
}

다시 말해, for루프는 일반적으로 일반적으로 사용되는 구문에 대한 (매우 유용한) 구문 설탕입니다 while.

그러나 for(;;)웹에서 기능적으로 동등한 구성 이 많이 있습니다.while(true)

이것에 대한 추론은 무엇입니까? 무한 for 루프가 무한 while 루프보다 선호되는 이유는 무엇입니까?

// while 루프를 전혀 사용하지 않는 Java 교과서를 보았습니다! 다음과 같은 괴물 같은 구성으로 이어집니다.

String input = getInput();
for( ; !inputIsValid(input) ; )
{
   //redo;
}

주된 이유는 선호입니다. 그러나 YMMV를 선택하면 가독성이 향상되어야합니다.
Aaron McIver

왜 어색한 구조를 선호합니까?
Chris Cudmore

10
당신은 교환 수 whilefor여기 질문은 변하지 않을 것입니다. while(true)for(;;)같은 것을 의미한다. 당신은 분명히 강한 선호를 가지고 있고 while, 다른 사람들은 같은 것을 선호 할 것 for입니다. 하나가 다른 것보다 더 정확하다고 말하는 것은 불가능합니다.
Caleb

3
@ chris, 찾을 수 없습니다 for(;;) 혼란스럽지 . 표준 C 관용구이며 K & R (2e)의 섹션 3.5에 문서화되어 있습니다. 나는 당신 이 그것을 좋아하지 않는다는 것을 이해 합니다. 당신 은 다른 사람들이 분명히 그것을 선호한다는 것을 이해해야합니다 (그렇지 않으면 결코 보지 못할 것입니다). C 이외의 언어에서는 다소 수용 가능할 수 있습니다. 이 언어에 구애받지 않는 태그를 지정 하여 결정적인 대답의 가능성 만 줄입니다. Q가 건설적이지 않기 때문에 다시 한 번 투표하기로했습니다. 내가 기분을 상하게한다면 나는 닫는 대신 또는 닫는 것에 더해 공격적인 것으로 표시되었을 것이다. 그게 다야.
Caleb

1
개인적으로 나는 무한 루프에 대한 완전히 다른 문법을 가지고 여기에 진정한 기회가 있다고 생각 : 뭔가처럼wheeeeeeee { ... }
detly

답변:


33

그것은 PDP-11의 오래된 프로그래밍 관행에서 보류 된 것입니다 (예, 저는 오래되었습니다 ). 단일 명령을 저장하는 데 사용되었으므로 루프 실행 속도를 높이는 데 유용했습니다.

추가 정보는 다음을 참조하십시오 : http://www.flounder.com/exceptions.htm


3
바로 내가 찾던 것입니다. 실제로 합법적 인 이유가 있지만 더 이상 유효하지 않습니다.
크리스 Cudmore

1
@ chris Nnnope, 현대 컴파일러는 때로는 루프 조건에서 상수를 사용하는 것에 대해 불평합니다. 순전히 숙취가 아닙니다.
이즈 카타

그것보다 더 많은 것이 있습니다. 유닉스 시스템에서 1990 년대 초에 C를 쓰는 것을 기억할 수 있지만 while (true) {}는 옵션이 아닙니다. 표준 부울 유형은 없었지만 여러 유닉스 시스템은 C 헤더 파일에 자체적으로 정의했습니다. 메모리에서 최소한 하나의 유닉스 벤더가 TRUE를 0으로 정의하여 성공시 0을 리턴하는 컨벤션이 함수 리턴을 처리하는 데 도움이되고 양수는 실패했습니다. 이것은 while (TRUE) {}이 이식성이 없다는 것을 의미했습니다.
Michael Shaw

1
나는 지금 그것을 찾을 수는 없지만 몇 년 전에 Dennis Ritchie가 Usenet에 이것이 단순히 잘못되었다는 내용의 게시물을 썼다는 것을 맹세 할 수 있었고 그는 for(;;)(그들의 의견으로는) 구문을보다 직접적인 진술로 사용 한다고 주장했다 루프 종료에 대해 언급 된 기준이 없었습니다.
Jerry Coffin

@ 프톨레마이오스 : 글쎄요 while(1) { }.
Ed S.

10

일부 컴파일러는 사용할 때 경고를 줄 것입니다 ( 조건 표현식 과 같은 것은 상수입니다 ). while( 1 )그러나 for( ; ; )경고 할 것이 없습니다. 프로그래머는 경고없이 코드를 원하므로 for 변형을 사용합니다.


컴파일러가 경고하는 것들은 완벽하게 유효하며, (특별한 경우에는) 불가피합니다. 그래서 우리 중 일부는 경고를 경고로 취급합니다. 당신이 그들을 무시하면 물론, 당신은 저주받은 것들에 늪에 빠질 수 있고 중요한 것들을 볼 수는 없지만 경고를 로컬 또는 전 세계적으로 비활성화 할 수있는 실용성과 옵션이 있습니다. 기본적으로 그렇습니다. 경고가없는 것이 낫지 만, 일반적으로 더 나쁜 코드 스타일을 채택하는 것보다 더 강력한 이유가 필요합니다. 여기서는 다른 점이 나쁘지 않지만 "무한한"루프는 아주 드물다 (또는 매우 나쁜 스타일).
Steve314

5

부울 유형이없는 C 프로그래밍에서 얻은 습관입니다. While (1)은 잠재적으로 동일하지만 For (;;)는 내가 올바르게 기억하면 K & R에 표시되는 것처럼 자주 사용됩니다. 어딘가에 하드웨어 이유가 있다고 생각합니다.


4
...이 의심 했습니다 ... 하드웨어 이유
아론 매키 버는에게

2
Edward Robertson이 언급했듯이 그 이유는 PDP-11의 C 컴파일러가 "while (true)"의 true가 컴파일 시간 상수라는 것을 인식하지 못하고 어셈블리를 생성 할 때 추가 명령어 (비교)를 추가하기 때문입니다. PDP-11에서 사용할 수있는 리소스가 제한되어 있기 때문에 프로그래머는 for 루프를 사용하여 프로그램에서 하나의 추가 명령을 최적화했습니다.
Jetti

3

for (;;)는 "영원히"보다 더 자연스럽게 보이는 "영원히"로 읽을 수 있습니다.


이것이 원래의 이유는 아니지만, 원래의 이유가 더 이상 사용되지 않은 후에도 선호도가 오래 지속되는 두 번째 이유입니다. 그러나 오랜 경험을 가진 프로그래머에게 물어 보는 것 외에는 이것을 뒷받침하는 증거를 내놓기가 매우 어렵습니다.
DarenW

-2

내가 요청한 모든 숙련 된 프로그래머 for(;;)while(true)또는 보다 더 빨리 인식 할 수 있습니다 while(1).


2
그만한 가치가있는 프로그래머라면 누구나 즉시 세 가지를 모두 인식 할 수 있어야합니다. 세 가지 모두 코드를 읽는 데 5 분 이상을 보낸 사람이 각 코드를 여러 번 보았을 정도로 일반적입니다.
cHao

1
연구 경험이 풍부한 프로그래머가 이해할 수있는 것으로 나타났습니다 for(;;)보다 빠른 14ms를 while(1):-)
케빈 클라인
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.