(;;) 또는 while (true)의 올바른 C # 무한 루프는 무엇입니까? [닫은]


97

C / C ++ 시절로 돌아가서 "무한 루프"를 다음과 같이 코딩했습니다.

while (true)

더 자연스럽고 더 분명해 보였습니다.

for (;;)

1980 년대 후반 PC-lint 와의 만남 과 그에 따른 모범 사례 논의는이 습관을 깨뜨 렸습니다. 이후 for제어문을 사용하여 루프를 코딩했습니다 . 오늘, 오랜만에 처음으로 그리고 아마도 C # 개발자로서 처음으로 무한 루프가 필요한 상황에 처해 있습니다. 그들 중 하나는 정확하고 다른 하나는 맞지 않습니까?


5
2 분 안에 4 개의 동일한 답변. 나쁘지 않다.
Jon B

5
무한 루프를 풀면 전체 종교적 논쟁을 피할 수 있습니다. 오래 걸리지 않아야합니다 ...
Stephen Darlington

7
호기심에서 : 왜 for (;;)가 C / C ++에서 더 나은가요?
Vilx-

6
내가 회상하는 @Vilx, 오래된 컴파일러는 while (1)보다 for (;;)로 더 효율적인 코드를 작성하는 데 사용되었습니다. 괜찮은 현대 컴파일러는 거의 동일한 코드를 출력 할 것이라고 확신합니다.
Stephen Darlington

4
Stephen과 Serhio의 의견을 바탕으로 : 1. while(true)조건이 필요합니다. for(;;)따라서 무조건 반복되는 무한 루프에 대한 더 나은 표현입니다. 2. 기존의 최적화되지 않은 컴파일러는 실제로 (true)루프를 실행 하면서 를 평가했을 수 있습니다 . 3. C는 텔레타이프 시대의 미니멀 한 언어, 300 보드 터미널, 1 문자 변수 이름입니다. 환경에서 모든 키 스트로크 카운트 곳 for(;;)보다 상당히 짧다 while(true).
Richard Dingwall 2011 년

답변:


124
while(true)
{

}

항상 내가 사용한 것과 다른 사람들이 수동으로 끊어야하는 루프에 사용하는 것을 본 것입니다.


@RSolberg-그것은 서로 몇 초 안에 제공되는 두 개의 유사한 응답 사이에 던져졌습니다. Adam의 후속 댓글로 인해 관습이 아닌 사용법에 따라 답변을 수락했습니다.
Bob Kaufman 09.09.09

1
와 for는 모두 수동으로 분리 할 수 ​​있습니다.
Allen Rice

2
불행히도이 답변은 질문에 대한 답변이 아닙니다. 정답은 "둘 다 맞습니다"입니다.
David R Tribble 2013

2
@Loadmaster : 그것은 "올바른"(또는 당신이 추구하는 "정확성"의 종류)에 대한 당신의 정의에 달려 있습니다.
Adam Robinson

314

C # 컴파일러는

for(;;)
{
    // ...
}

while (true)
{
    // ...
}

으로

{
    :label
    // ...
    goto label;
}

둘 다에 대한 CIL은 동일합니다. 대부분의 사람들 while(true)은 읽고 이해하기가 더 쉽습니다. for(;;)다소 비밀 스럽습니다.

출처:

.NET Reflector를 조금 더 엉망으로 만들고 Visual Studio에서 "Optimize Code"를 사용하여 두 루프를 모두 컴파일했습니다.

두 루프 모두 다음으로 컴파일됩니다 (.NET Reflector 사용) :

Label_0000:
    goto Label_0000;

랩터는 곧 공격해야합니다.


7
네, 두 번 확인했습니다. 모두 동일한 IL 코드입니다. 이것은 허용되는 답변이어야합니다. IMO :)
Allen Rice

63
xkcd 참조 용 +1
Ikke

4
현명하게 말하면 컴파일러는 하나의 명령문 형식을 다른 형식으로 변환 하지 않습니다 . 오히려 두 문에 대해 동일한 코드를 생성합니다. 이 코드는 gotobtw 문과 동일합니다 . 이는 놀라운 일이 아닙니다.
David R Tribble

1
그런 다음 goto가 jmp 명령어로 번역됩니다.
Marco M.

25
그래서 분명히 goto LOOP올바른 C # 무한 루프입니다 :)
Dustin Getz

61

나는 이것이 더 읽기 쉬울 수 있고 확실히 C #에서 사용하는 표준이라고 생각합니다.

while(true)
{
   //Do My Loop Stuff
}

19
@voyager : 1은 C #에서 'true'를 대체하지 않습니다.
Adam Robinson

17
while (1)은 유효하지 않습니다 C # : 상수 1은 bool로 변환 할 수 없습니다
Vinko Vrsalovic

4
while(1)이후, C #에서는 유효하지 않습니다 1하지 않은 것입니다 bool.
Pavel Minaev

47

헐떡이고, 사용 :

while (!false)
{

}

또는 jsight가 지적했듯이 두 배로 확신 할 수 있습니다.

while (!false && true)
{
}

사람들이 나에게 소리를 지르기 전에 모두 동일한 CIL 코드입니다. :)


최고의 답변입니다.
Larry

38

몇 가지 오래된 농담을 다시 해보려면 :

  1. 사용하지 마십시오 "for (;;) {} "을 (를) . 이는 진술을 울립니다.
  2. 물론 " #define EVER ;;"이 아니라면 .

25
또는 #define ever (;;)더 읽기 쉽다고 생각합니다. for ever {}
Chris Lutz

1
나는 당신이 이제까지 #DEFINE을 할 수 있다고 생각 didnt는 (;;)에서 C #은하지만, 농담은 : 재미
알렌 쌀

1
아. 나는 OS X에서 C를 프로그래밍했다. 나는 C # 전처리 기가 그렇게 거세되었다는 것을 몰랐다. 이 질문을 어떻게 읽기 시작했는지 모르겠습니다. C #을 무시 된 태그로 사용했습니다.
Chris Lutz

C # 전처리 기는 적어도 C, C ++, PL / 1 및 심지어 매크로 어셈블러가 제공하는 측면에서 볼 때 실제로 전처리 기가 아닙니다. 전 처리기 기호를 정의 / 정의하지 않음으로써 코드 블록을 활성화 또는 비활성화 할 수 있습니다.
David R Tribble

6
또는 더 나은 방법 : #define forever while(true);)
Roberto Bonvallet

26

구식으로 가고 싶다면 C #에서 goto가 계속 지원됩니다.

STARTOVER:  
    //Do something
    goto STARTOVER;

진정한 무한 루프의 경우 이동 명령입니다. =)



6
나는 이것을 부정적인 평가에서 0으로 다시 찬성했지만 그 유머 가치 때문입니다. 어쨌든 모든 루프는 JMP 어셈블러 opcode로 컴파일됩니다.
David R Tribble

@Loadmaster : 고마워, 나는 그것을 반드시 보증하는 것이 아니라 다른 옵션으로 던지고 있었다.
JohnFx

2
@serhio : 어딘가에서 무언가를 읽었 기 때문에 언어 구조를 피하는 것이 더 좋습니다. 그 자체로 나쁜 언어 요소는 없으며 나쁜 방식으로 만 사용할 수 있습니다.
JohnFx 2010

2
@serhio : 가능한 거의 모든 키워드를 사용하여 자연에 대한 혐오감을 보았습니다. 그것은 언어 요소가 아니라 프로그래머입니다. 어쨌든 이전 의견에서 언급했듯이 나는 그것을지지하지 않았습니다. 나는 완전성과 유머 감각을 위해 그것을 포함했습니다.
JohnFx 2010


10

진정한 무한 루프가 필요한 상황에서 저는 항상

while(true) {...}

빈 for 문보다 의도를 더 잘 표현하는 것 같습니다.


10

개인적으로 나는 조건 for(;;)없기 때문에 항상 정확하게 선호 했습니다 while (true). 그러나 이것은 정말 사소한 스타일 포인트이며, 어느 쪽이든 논쟁 할 가치가 없다고 생각합니다. 나는 아직 두 가지 접근 방식을 의무화하거나 금지하는 C # 스타일 지침을 보지 못했습니다.


컴파일러가 조건없이 잠시 동안 조건없이 (나쁜 읽기) 변환 할 때 .NET에서 가치가 없습니다 .
serhio

3
@serhio : "컴파일러 변환 ..."이 의미하는 바를 설명하십시오 while. 프로그래머에 관한 한 컴파일러는 고수준 코드를 IL로 변환합니다. IL 에는 while(또는 for) 루프 가 없으며 레이블과 gotos 만 있습니다.
Pavel Minaev

1
Pierre-Alain Vigeant의 답변을 참조하십시오.
serhio

3
그의 대답은 단순히 "컴파일러가 둘 모두에 대해 동일한 IL을 생성"하는 것으로 더 잘 표현 될 수 있습니다 (AST 레벨에서 어떤 것을 변환하는지와 언제 변환하는지 실제로 알 수 없으며 어떤 경우에도 구현 세부 사항입니다). 어쨌든 이것은 ".NET에서 그만한 가치가없는"이유를 설명하지 않습니다. C ++, Java도 마찬가지입니다.
Pavel Minaev

6

나는 개인적으로 for (;;)관용구를 선호한다 (C / C ++ 관점에서 나온다). 나는 while (true)그것이 어떤 의미에서 더 읽기 쉽다는 것에 동의하지만 (그리고 그것은 C / C ++에서도 사용했던 것입니다), 나는 for다음과 같은 이유로 관용구 를 사용했습니다 .

  • 눈에 띈다

나는 루프가 (정상적인 방식으로) 끝나지 않는다는 사실이 '부르는'가치가 있다고 생각하고 나는 for (;;)이것을 조금 더 수행 한다고 생각합니다 .


마지막으로, 우리는 프로그램을 컴파일하는 것이 더 조금 기다리는 사용하여 (=>에 대한에서 컴파일 변환을하는 동안)
serhio

3
@serhio : 정말 아닙니다. 에서 로 변환 하지 않습니다 . 및 모두에 대해 새 코드를 생성 합니다. 이 답변을 참조하십시오 . forwhilefor (;;){}while (true){}while(true){}
wchargin 2012-08-25

6

C #이 조상을 추적 할 수있는 C 용 K & R 원본 책 권장

for (;;) ...

무한 루프의 경우. 모호하지 않고 읽기 쉬우 며 그 뒤에 길고 고귀한 역사가 있습니다.

추가 (2017 년 2 월)

물론이 루핑 형식 (또는 다른 형식)이 너무 모호하다고 생각하면 언제든지 주석을 추가 할 수 있습니다 .

// Infinite loop
for (;;)
    ...

또는:

for (;;)    // Loop forever
    ...

1
예,하지만 이것은 C #이 아닌 C 용입니다.
serhio

1
C #에서 작동합니다. 그리고 C # 언어는 C에서 (간접적으로) 파생되었습니다.
David R Tribble

4
8 년 후 당신은 답변을 업데이트하기로 결정했습니다. 니스
Metoniem

4

while(true)아니 어야 while(1)하므로 while(1)C #에서는 올바르지 않습니다. 예;)


2

또는 무한 루프를 갖는 것은 어쨌든 앱이 실제로 영원히 실행되지 않는 한 종료 조건이 필요하기 때문에 일반적으로 나쁜 습관이라고 말할 수 있습니다. 그러나 이것이 순항 미사일의 경우 명시적인 출구 조건이 필요하지 않을 수도 있습니다.

나는 이것을 좋아하지만 :

for (float f = 16777216f; f < 16777217f; f++) { } 

2
-1 : 모두가 ..., 아마도 누군가가 그것을이 버그라고 생각하고 "수정"을 시도 할 수있는 코드를 읽는 당신의 "무한 루프"를 이해
serhio

C # f < 16777217f에서는 항상 false...이므로 반복되지 않습니다.
NetMage

2

나는 약간 더 "문학적인"코드를 선호합니다. 실제로 다음과 같이 할 가능성이 훨씬 더 높습니다.

bool shouldContinue = true;
while (shouldContinue)
{
    // ...

    shouldContinue = CheckSomething();
}

1
으. 사실, 그것은 do ... while()변장 의 고리입니다. 그것을 보는 데 몇 초가 걸렸습니다. do ... while()루프 를 작성했다면 즉시 명확 해졌을 것입니다. -1
sbi

while (true)을 사용할 수 있는데 변수를 선언하는 데 시간과 자원을 낭비하는 이유는 무엇입니까? 제 의견으로는 말이되지 않습니다
waqasahmed 09-09-09

특히 의미있는 특정 플래그 (예 : 취소가 루프를 중지하는 유일한 방법임을 나타내는 "while (! this.canceled)")를 첨부 할 수있는 경우 더 읽기 쉽습니다. 루프를 나타내는 "while (! processExited)" 외부 프로세스가 없어 질 때까지 실행해야합니다. 유지 보수 용이성 또는 가독성이라는 이름으로 절대적으로 수행 할 수있는 "자원을 낭비"하는 것들이 많이 있습니다. "while (true)"는 그렇게 나쁘지는 않지만 내 경험상 일반적으로 더 나은 방법이 있습니다.
bobbymcr

1
+1. 대부분의 경우 진정한 무한 루프는 실제로 발생하는 것이 아니며 중지하고 싶은 조건이 있습니다 (예 : 프린터에 불이 붙을 때).
Lie Ryan

1
…이 경우 break.
Ry-

2

나는 또한 아래의 것이 더 낫다고 말합니다 :)

while(true)
{

}

1

코드 골프를한다면 for(;;). 그 외에도 while(true)동일한 의미를 가지며 더 직관적으로 보입니다. 어쨌든 대부분의 코더는 두 가지 변형을 모두 이해할 수 있으므로 실제로는 중요하지 않습니다. 가장 편안한 것을 사용하십시오.


2
골프를 치고 있다면 C #은 어쨌든 잘못된 언어입니다.
SingleNegationElimination

1

내가 말하고 싶은 유일한 이유 for(;;)는 CodeDom 제한 때문입니다 (while 루프는 CodeDom을 사용하여 선언 할 수 없으며 for 루프는 반복 루프로 더 일반적인 형식으로 보입니다).

이것은 사실을 제외하고 이것을 선택하는 꽤 느슨한 이유입니다. for 루프 구현이 일반 코드와 CodeDom 생성 코드 모두에 사용될 수 입니다. 즉, 더 표준이 될 수 있습니다.

참고로 코드 스 니펫을 사용하여 while루프 를 만들 수 있지만 전체 루프는 스 니펫이어야합니다.


1

둘 다 동일한 기능을 가지고 있지만 사람들은 일반적으로 while(true). 읽고 이해하기 쉽습니다 ...


0

항상 true를 반환하는 표현식은 while 루프에 대해 OK 여야합니다.

예:

1==1 //Just an example for the text stated before 
true

true가 잘 작동 할 때 1 = 1과 같은 비교를하도록 강요하는 이유는 무엇입니까? 계산 된 표현식을 사용하는 것은 NUMBER_OF_ARMS = 598-3596과 같은 상수를 정의하는 것만 큼 어리석은 느낌이 듭니다.
JohnFx

코드 앞에 명시된 답변에 대한 예 :)
George

0

코드 가독성 측면에서 while(true)어떤 언어로든 에서 더 합리적이라고 생각합니다. 컴퓨터가 그것을 어떻게 보는지에 관해서는 오늘날의 매우 효율적인 컴파일러와 인터프리터 사회에 어떤 차이가 있어서는 안됩니다.

성능 차이가 있다면 MSIL 로의 번역이 최적화 될 것이라고 확신합니다. 정말로 원하면 확인할 수 있습니다.

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