(;;) 또는 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.