“for (;;)”가“while (TRUE)”보다 빠릅니까? 그렇지 않은 경우 사람들은 왜 그것을 사용합니까?


164
for (;;) {
    //Something to be done repeatedly
}

나는 이런 종류의 일이 많이 사용되는 것을 보았지만 다소 이상하다고 생각합니다 ... 말하기 while(true)또는 그 선을 따라 뭔가 가 더 명확하지 않습니까?

나는 (많은 프로그래머가 암호 코드에 의지하는 이유와 같이) 이것이 작은 마진이 더 빠르다고 추측하고 있습니까?

왜, 그리고는 정말 가치? 그렇다면 다음과 같이 정의하십시오.

#define while(true) for(;;)

참조 : while (1) 또는 while (2) 중 어느 것이 더 빠릅니까?


51
무엇입니까 TRUE???
AnT

20
@Steven Sudit : TRUEC와 어떤 관련이 있습니까? C99의 실제 부울 결과에 대한 표준 매크로는 여전히 있습니다 true. 어디에서 TRUE왔습니까?
AnT

31
이 매크로는 작동하지 않습니다 #define EVER ;;. 그러나 IOCCC에서 사용되었습니다 .. :)

18
#define while(TRUE)하나의 인수를 TRUE사용 하는 매크로를 선언하는 매크로가 사용되지 않으므로 프로그램의 모든 단일 루프를 무한 루프로 바꾸지 않습니까?
AshleysBrain

9
@Steven Sudit : 아니요. "VS 6.0의 표준 매크로"는 없습니다. 매크로 TRUE는 Windows API와 관련된 헤더 파일에서 가져옵니다. VS 6.0과 관련이 없습니다. 그리고 이전에 말했듯이 C 또는 C ++과 관련이 없습니다. C ++에서 "true"리터럴은 trueVS 6.0에서도 마찬가지입니다. C89 / 90에는 그러한 것이 전혀 없으며 C99에서는 macro true입니다. 이것은 모든 C / C ++ 컴파일러에 적용됩니다.
AnT

답변:


262
  1. 더 빠르지 않습니다.
  2. 정말로 관심이 있다면 플랫폼에 대한 어셈블러 출력으로 컴파일하고 확인하십시오.
  3. 중요하지 않습니다. 이것은 중요하지 않습니다. 당신이 원하는대로 무한 루프를 작성하십시오.

227
직관적으로 무한 루프를 최적화하면 무한한 속도 향상이 가능합니다. 우리는 직관에 프로그래밍하지 않는 것이 좋습니다. :-)
Steven Sudit

5
당신 말이 맞아요 나는 작은 것들에 대한 "종교적인"토론에 빠졌다고 생각합니다. 양심을 느슨하게 해주셔서 감사합니다. : D
Chris Cooper

6
@Steven LOL은 흥미 롭습니다. 그러나 무한 속도 향상의 가능성에 실제로 도달 한 유일한 시나리오는 루프가 끊어지지 않고 무한정 실행되는 경우입니다. 그 잠재력에 도달하기 전에 무한 대기.
AaronLS

7
@ 크리스. 인생에서와 같이 프로그래밍에서 종교 토론은 실제로 중요한 일을 할 가치가 있습니다. 이것은 단지 그중 하나가 아닙니다. 보시다시피, 모든 사람들은 끝없는 루프를 작성하는 애완 동물 방법을 가지고 있습니다. 작은 일에 가장 적합한 것을 골라 내고 중요한 코드에서 프로파일 러를 실행하십시오. :)
Ben Zotto

3
일부 플랫폼의 일부 초기 컴파일러는 상수를로드하고 조건부로 점프했기 때문에 문제가되었습니다. 당시에는 하드웨어가 중요했습니다.
peterchen

176

나는 for(;;)두 가지 이유로 선호 합니다.

하나는 일부 컴파일러에서 경고를 생성 while(true)한다는 것입니다 ( "loop condition is constant"와 같은 것). 경고를 피하는 것은 항상 좋은 일입니다.

또 하나는 내가 for(;;)더 명확하고 더 많은 것을 생각한다는 것 입니다. 무한 루프를 원합니다. 그것은 문자 그대로 아무런 조건 없으며, 아무것도 의존하지 않습니다. 나는 그것을 벗어날 무언가를 할 때까지 영원히 계속되기를 원합니다.

반면에 while(true), 사실은 무엇과 관련이 있습니까? 나는 true가 false가 될 때까지 반복에 관심이 없습니다. 그냥 반복하고 싶습니다.

그리고 성능 차이는 전혀 없습니다.


73
경고를 피하기 위해 +1. 그러나 명확성을 위해, 나는이 맥락에서보다 명확하게 찾습니다. 나는 그 측면이 개인적 취향에 달려 있다고 생각합니다.
Tim

14
그렇습니다, 선호와 습관. 에 익숙하지 않다면 for(;;)분명히 이상하게 보일 것입니다. 그러나 나는 그것이 있기 때문에 그것에 익숙해 시도하는 것이 좋습니다 것 입니다 일반적인 관용구, 당신은 다시 그것으로 실행하는 것입니다. ;)
jalf

7
관용적 인 것에 대한 jalf의 의견은 실제로 여기에 대한 대답입니다. 그것은 일반적으로 단순히 때문에 "무한 루프"를 위해 사용되는 것입니다 그냥 자기 강화 협약 - 관용구에 대한 좋은 이유가있는 것없는 C.에 "무한 루프"를 작성의 일반적으로 사용되는 방법입니다.
caf

7
@ 스티브 : 나는 줄 이유가 표시되지 않습니다 지금까지 사용 for(;condition;). 그것이 while 루프의 목적 입니다. 하지만 말했듯, 무한 루프와, 정말 컴파일러는 비교하지 않으려는 어떤 조건을. 순진은 함께 while루프, 그것을 테스트해야 할 것 true마다 반복 (조차 멍청한 컴파일러가 그렇게 할 것입니다 분명하지만, 귀찮게 나. 그것은 당신의 코드를 overspecifying 나를 파업한다는 원칙이다)를 함께하는 동안, for(;;)당신은 말 그대로 말 "테스트 할 조건이 없습니다. 그냥 루프하십시오". 나는 그것이 당신의 상상과 가장 loop {...}
비슷

32
while(true)경고 메시지가 표시 되면 컴파일러가 짜증납니다 .
Albert Albert

56

개인적으로 나는 for (;;)숫자가 없기 때문에 사용 합니다. 단지 키워드 일뿐입니다. 나는 그것을 좋아 while (true), while (1), while (42), while (!0)등 등


38
0, 1 및 무한대는 허용 가능한 매직 번호이며 0과 1을 false로 확장하면 true는 손실이 아닙니다. 매직 키워드 true보다 더 이상 매직 넘버가 아니 for거나 for(;;)묵시적인 매직 무한대 를 사용합니다. ( while (42)실제로 가증 한 일이다.)

38
탄젠트 : 저의 CS 교수 중 한 명은 "프로그래밍에는 0, 1, n 등 3 개의 숫자 만 있습니다. 다른 것은 매직 넘버라고합니다."라고 말했습니다.
Ben Zotto

21
while (42)는 가장 시원하며 while (1) 또는 while (true) 또는 while (! 0)과 관련하여 다른 결과를 생성하지 않으며 철학적 의미를 갖습니다. for(;;)어쨌든 다른 것보다 더 빨리 구문 분석 된다고 가정 합니다.
ShinTakezou

2
@ShinTakezou #define LIFE 42 while (LIFE):)
mr5

1
물론 while(true)숫자도 포함하지 않습니다. for (;;)는 키워드가 아닙니다
RiaD

49

데니스 리치 때문에

  • for (;;)Dennis Ritchie가 K & R에서 사용 하는 방식이기 때문에 사용 하기 시작했고 새로운 언어를 배울 때 항상 똑똑한 사람들을 모방하려고합니다.

  • 이것은 관용적 인 C / C ++입니다. C / C ++ 공간에서 많은 일을 할 계획이라면 장기적으로 익숙해지는 것이 좋습니다.

  • 당신의 #define물건은 #define을 인 이후 의지하지 작업은 C 식별자처럼 보이게한다.

  • 모든 최신 컴파일러는 두 구문에 대해 동일한 코드를 생성합니다.


10
그렇습니다. 이것은 누군가가 K & R로부터 C를 배운다는 것을 아는 방법입니다. 내가 볼 때마다 while(TRUE)프로그래머가 C 초보자라고 생각하거나 For Dummies 책에서 C를 배웠다고 생각합니다.
Kristopher Johnson

13
그 초보자들이 새로운 기능 정의 스타일을 사용 한다고 들었 습니다.
저스틴

46

제정신 컴파일러에서 확실히 빠르지는 않습니다. 둘 다 무조건 점프로 컴파일됩니다. for 버전은 입력하기가 쉽고 (Neil이 말한 것처럼) for 루프 구문을 이해하면 명확합니다.

궁금한 점이 있다면 gcc 4.4.1이 x86에 제공하는 내용입니다. 둘 다 x86 JMP 명령어를 사용합니다 .

void while_infinite()
{
    while(1)
    {
    puts("while");
    }
}

void for_infinite()
{
    for(;;)
    {
    puts("for");
    }
}

다음과 같이 컴파일합니다.

.LC0:
.string "while"
.text
.globl while_infinite
    .type   while_infinite, @function
while_infinite:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
.L2:
    movl    $.LC0, (%esp)
    call    puts
    jmp .L2
    .size   while_infinite, .-while_infinite
    .section    .rodata
.LC1:
    .string "for"
    .text
.globl for_infinite
    .type   for_infinite, @function
for_infinite:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
.L5:
    movl    $.LC1, (%esp)
    call    puts
    jmp .L5
    .size   for_infinite, .-for_infinite

디버그 모드에서도 더 빠릅니다.
Steven Sudit

106
for_infinite가 더 빠르다; 2 개 적은 문자 puts.
Dave Jarvis

43

나는 선호한다 for (;;)다른 C와 같은 언어에서 가장 일관성이 있기 때문에 합니다.

C ++에서 while (true)괜찮지 만, C에서 당신이 정의하는 헤더에 따라 true, 아직 TRUE너무 일반적으로 사용되는 매크로입니다. 당신이 사용하는 경우 while (1)는 C와 C ++에서 정확한, 그리고 자바 스크립트가 아니라 루프 조건을 필요로 자바 나 C #은 같은 부울로 while (true)또는while (1 == 1) . PHP에서 키워드는 대소 문자를 구분하지 않지만 언어는 대문자를 선호합니다TRUE .

그러나 for (;;)모든 언어에서 항상 완벽합니다.


9
답변 주셔서 감사합니다! 나는 이것이 실제로 객관적인 방법을 보여주는 첫 번째 대답이라고 생각합니다 for (;;).
Chris Cooper

8
C, C ++, JavaScript, Java 및 C #에서 올바른 코드를 작성할 필요가 없다고 생각합니다. 그들은 다른 언어입니다.
키이스 톰슨

6
@KeithThompson 많은 언어에서 올바른 코드 작성에 관한 것이 아닙니다. 나는 그것이 다른 배경을 가진 개발자들 사이의 오해를 피하는 것에 관한 것이라고 생각합니다.
Mauro Sampietro

6
@sam : 둘 while (1)for (;;)문제 이해를 가진 C 프로그램을 읽기 C. 누군가에 무한 루프에 대한 일반적인 숙어는 하나 가능성이 코드의 나머지 부분에 문제가있을 것이다. C를 모르는 사람이 쉽게 읽을 수있는 C 코드를 작성하는 것은 가치가 없습니다.
Keith Thompson

6
@KeithThompson C의 유능한 독자는 두 관용구에 대해 잘 알고 있어야하지만 작가가 폴리 글롯 프로그래머 인 경우에도 유용 할 수 있습니다. 마지막 작업에서 매일 JS, ActionScript 및 PHP로 작업했으며 코드 작성 방식 (통합되는 위치)을 통합하여 프로그래밍 속도를 높이고 유지 관리를 쉽게 할 수 있습니다.
Ionoclast Brigham

21

나는 개인적으로 for (;;)관용구를 선호합니다 (와 동일한 코드로 컴파일됩니다) while (TRUE).

while (TRUE)어떤 의미에서 사용하는 것이 더 읽기 쉬울 수 있지만, 나는 for (;;)관용구 가 눈에 띄기 때문에 사용하기로 결정 했습니다 .

무한 루프 구조는 코드에서 쉽게 알아 차 리거나 호출해야하며 개인적으로 for (;;)스타일이 while (TRUE)또는 보다 약간 더 좋습니다 while (1).

또한 while 루프의 제어식이 상수 일 때 일부 컴파일러가 경고를 발행한다는 것을 기억합니다. 나는 그것이 너무 많이 발생한다고 생각하지 않지만, 가짜 경고의 가능성만으로도 그것을 피하고 싶을 정도로 충분합니다.


17

나는 어떤 사람들이 다음과 같은 #define을 가지고 있기 때문에 그것을 선호하는 것을 보았습니다.

#define EVER ;;

그들은 이것을 쓸 수 있습니다 :

for (EVER)
{
    /* blah */
}

24
나도 그것을 보았다; 그러나 그것을 선호하는 좋은 이유는 아닙니다. 관리자로서, 매크로 코드가 분명한 반면 매크로 정의가 예상대로 작동하는지 확인해야합니다. RTOS VxWorks에는 매크로가 FOREVER정의 for(;;)되어 있지만 더 나쁘지 않습니다. IMO 매크로를 사용하여 새로운 언어를 '발명'해서는 안됩니다.
Clifford

8
실제로 일부 언어에서 매크로의 목적은 새로운 구문을 발명하는 것입니다. 그러나 C / C ++에서 'for (EVER)'에 관계없이 막대합니다.
Dan Olson

15
어떤 사람들은 파스칼을 좋아하는 경우와 같이 재미있는 일 #define BEGIN {#define END }합니다. 나는 #define DONKEYS_FLY (0)그들이 말할 수 있도록 보았습니다 if DONKEYS_FLY .... 소프트웨어가 둔하다고 누가 말합니까?
Mike Dunlavey

11
캘리포니아에서 나는 당신을 믿습니다, 당신은 #DEFINE에 대한 (;;) LIKE_FOREVER에
마틴 베켓

1
: 나는 저항 할 수 없었다 #define never while(0)#define always
alfC

16

어떻습니까 (언어가 지원하는 경우) :

start:
/* BLAH */
goto start;

... 적당한 컴파일러의 손에 동일한 출력을 생성해야합니다.
Ben Zotto

9
+1! goto의 수많은 단점을 개선하지는 않지만 구현하려는 알고리즘이 순서도에서 나온 경우 가장 직접적인 번역입니다.
Edmund

4
저는 개인적으로 goto에 대한 실용적인 관점을 취합니다. 랩터가 없습니다. 랩터는 사람입니다. 그리고 스파게티 코드를 만들기 위해 goto를 사용하기 시작한 사람들이었습니다. 또한 루프에 대한 조립 출력은 이와 거의 비슷합니다. 컴퓨터의 명령어 세트에는 "for"또는 "while"이라는 개념이없고 "jump"만 있습니다.
josaphatv '10

결코 이제까지 이제까지 사용goto
에드워드 가락

정말 좋은 점은 루프를 무한히 만들기 위해 goto누군가를 추가하는 것에 대해 걱정할 필요가 없다는 것 break입니다. (당신이 이미 다른 while또는 for루프 안에 있지 않는 한 ...)

12

생성 된 머신 코드와 관련하여 차이가 없습니다.

그러나 트렌드를 극복하기 위해 while (TRUE) 형식이 for (;;)보다 훨씬 읽기 쉽고 직관적이며 가독성과 선명도가 어떤 이유보다 코딩 지침의 중요한 이유라고 주장합니다. for (;;) 접근 방식에 대해 들었습니다 (저는 확실한 추론 및 / 또는 유효성 증명에 기반한 코딩 지침을 선호합니다).


6
언어에 따라 다릅니다. for(;;)C 및 C ++에서이를 수행하는 전통적인 방법입니다. while(true)C # 및 Java 및 기타 언어의 규칙 인 것 같습니다. 귀하의 마일리지가 다를 수 있습니다.
Billy ONeal

9
예, C 또는 C ++에 익숙하지 않은 사람은 sscanf보다 STRING_SCAN_FORMATTED를 더 읽기 쉽게 읽을 수 있지만 코드 상단에 #define STRING_SCAN_FORMATTED sscanf를 넣은 사람은 없습니다.
ta.speot.is는

4
나는 그것이 일의 관용적 방법 말하고 싶지만 더 나은했다 개발자에게 가장 읽을 수 있습니다. 그렇지 않으면 더 나은 개발자가 필요합니다.
jalf

5
@despart : 누군가가 C ++에 익숙하지 않아서 그 관용구를 인식하지 못하면, 내 코드베이스에서 멀어지게해야합니다.
Billy ONeal

4
나는 관용적 방법이 가장 읽기 쉽다는 것에 동의합니다. 그렇기 때문에 언어와 관행이 발전함에 따라 관용적 방식에 항상 도전하고 변화해야하는 이유가 여기에 있습니다. 끔찍한 K & R "아이디 오 매틱"코딩 스타일이 현대적이고 읽기 쉬운 스타일로 대체 되려면 몇 년이 걸렸지 만 여전히 일어났습니다.
Jason Williams

11

잘 알려진 패턴뿐만 아니라 C (및 C ++)의 표준 관용구


3
예, 일부 컴파일러 while (true)는 동일한 이유로 경고한다고 생각 합니다 if (true).
Steven Sudit

11
while(true)

Visual Studio에서 경고를 생성합니다 (조건이 일정 함). 내가 일한 대부분의 장소는 오류로 경고와 함께 프로덕션 빌드를 컴파일합니다. 그래서

for(;;)

선호됩니다.


7
어떤 Visual Studio 버전을 사용하고 있습니까? 2008을 난 수준 4. 경고에서이 경고를하지 않습니다
요르겐 Sigvardsson

11

코드가 컴파일러에 의해 최적화되면 둘 다 동일해야합니다. 최적화의 의미를 설명하기 위해 다음은 MSVC 10으로 작성된 샘플 코드입니다.

int x = 0;

while(true) // for(;;)
{
    x +=1;

    printf("%d", x);
}

디버그 모드로 빌드하면 ( 최적화 (/ Od)없이 ) 분해가 명확한 차이를 보여줍니다. true내부 조건에 대한 추가 지침이 있습니다 while.

while(true)
00D313A5  mov         eax,1                //extra 
00D313AA  test        eax,eax              //extra
00D313AC  je          main+39h (0D313B9h)  //extra
    {
        x +=1;
00D313AE  mov         eax,dword ptr [x]  
00D313B1  add         eax,1  
00D313B4  mov         dword ptr [x],eax  
    printf("%d", x);
    ...
    }
00D313B7  jmp         main+25h (0D313A5h)  


for(;;)
    {
        x +=1;
00D213A5  mov         eax,dword ptr [x]  
00D213A8  add         eax,1  
00D213AB  mov         dword ptr [x],eax  
    printf("%d", x);
    ...
    }
00D213AE  jmp         main+25h (0D213A5h)  

그러나 릴리스 모드에서 코드를 빌드하면 (기본 최대화 속도 (/ O2) ) 둘 다에 대해 동일한 출력을 얻습니다. 두 루프 모두 하나의 점프 명령으로 줄어 듭니다.

for(;;)
    {
        x +=1;
01291010  inc         esi  

        printf("%d", x);
    ...
    }
0129101C  jmp         main+10h (1291010h)  

    while(true)
    {
        x +=1;
00311010  inc         esi  

        printf("%d", x);
    ...
    }
0031101C  jmp         main+10h (311010h)  

속도 최적화가 설정된 괜찮은 컴파일러에는 어떤 것이 든 사용할 수 있습니다.


이것은 실제로 아주 좋은 지적입니다! 최적화하지 않으면 최신 컴파일러조차 몇 가지 명령에 따라 다릅니다.

9

어느 쪽이 더 빠른 개인 취향의 문제입니다. 개인적으로, 나는 프로그래밍하는 동안 터치 타이피스트이며 키보드를 보지 않습니다. 키보드의 104 키를 모두 터치 타이핑 할 수 있습니다.

"while (TRUE)"을 입력하는 것이 더 빠르지 않습니다.

나는 손가락 움직임 측정을 정신적으로 추가하고 합계했습니다. "for (;;)"는 약 12 ​​개의 키 너비의 앞뒤로 이동하고 (홈 키와 키 사이, 홈 키와 SHIFT 키 사이) "while (TRUE)"은 약 14 개의 키 너비 뒤로 이동하고 네번째.

그러나 후자를 입력 할 때 오류가 발생하기 쉽습니다. 나는 한 번에 한 마디로 생각하기 때문에 "nIdx"와 같은 두문자어보다 "nIndex"와 같은 것을 입력하는 것이 더 빠릅니다. 왜냐하면 실제로 내 마음 속에 말을하기보다는 글자를 정신적으로 철자하고 내 손가락을 자동으로 만들어야하기 때문입니다. 단어를 입력하십시오 (자전거 타기 등).

(My TypingTest.com 벤치 마크 = 136 WPM)


3
OP가 입력 속도가 아닌 런타임 속도를 의미한다고 생각합니다.

알아. 저 기지도 덮어야 했어요
Mark Rejhon

7
s / 개인 취향 / 개별 습관 /
SamB

@SamB : s ///에 대한 의견 투표. xD 그리고 그렇습니다. 런타임 속도 때문일 수도 있지만 실제 대답을 몰랐습니다. 이것이 사실이라면, 나는 행복했을 것입니다.
Chris Cooper

를 실행 time head -10 >/dev/null하고 각 10 회를 입력 한 후 결과를 측정하십시오. for(;;)당신이 속이지 않으면 더 빨라질 것 입니다. 약 14 % 정도였습니다.
PSkocik

6

모든 좋은 답변-행동은 정확히 동일해야합니다.

그러나 차이가 있다고 가정 해 봅시다. 그들 중 하나가 반복 당 3 개의 지시를 더 받았다고 가정하자.

걱정해야합니까?

당신이 루프 안에하는 일은없는 경우에만 거의 아무것도 없다, 거의 절대 경우.

요점은 마이크로 최적화와 매크로 최적화가 있다는 것입니다. 미세 최적화는 "체중 감량을 위해 이발을 얻는 것"과 같습니다.


3
얼마나 자주 당신은 사람들이 선호하는 말 보는가 ++i이상 i++?
Dennis Zickefoose

7
@Dennis Zickefoose : 차이 ++i와이 i++경우 잠재적으로 중요 할 수 i는 A 클래스의 인스턴스가 아닌 인에 내장 컴파일러는 사소한 최적화를 적용하지 않는다. 조언은 습관을 습득하여 계산할 때 당신을 잡지 못하게하는 것입니다.
Clifford

5
++ivs 에 대한 것은 i++"최적화"를 만드는 데 비용이 들지 않는다는 것입니다. 사실 대부분의 경우 아무런 차이가 없지만 입력하기가 쉽기 때문에 기본적으로 잠재적으로 가장 효율적인 것을 선호하지 않는 이유는 무엇입니까? 그리고 여기에도 똑같이 적용됩니다. 한 경우 였다 다른보다 작은 조금 더 빨리, 왜 하지 빨리 하나에 갈? 그렇게함으로써 우리는 무엇을 잃을 것입니까? 둘 다 읽고 쉽게 입력 할 수 있습니다.
jalf April

2
@Dennis Zickefoose : 네 말이 맞아. 나는 SO에 많은 것을 보았고 Clifford의 의견은 옳다. 또한, 내가 별로 많이 보지 못한 것이 있는데, 그것은 43 배 속도 향상과 같은 매크로 최적화를 수행하는 방법입니다 : stackoverflow.com/questions/926266/… . 그래서 우리의 우선 순위가 궁금합니다.
Mike Dunlavey

2
@ Mike : 네,하지만 그것은 사과와 오렌지 비교입니다. 이발을 얻는 데 실제 시간과 돈이 필요할 수도 있습니다. 나는 그것이 중요하지 않은 미세 최적화라고 동의합니다. 그러나 비용 도 들지 않습니다 . 왼쪽 또는 오른쪽으로 이동하도록 선택할 수 있고 거리가 동일하고 지형이 동일 하면 왼쪽 경로에 약간의 미세한 이점이 있다는 점을 제외하고 모든 것이 동일합니다. 왜 왼쪽으로 가지 않습니까? 맞습니다. 인상적인 주장은 아닙니다. 그러나 비용이 문자 그대로 0이면 최적의 경로를 선호 할 이유가 없습니다.
jalf

5

가치있는 컴파일러가 다른 코드를 생성한다고 상상할 수 없습니다. 그렇게하더라도 더 효율적인 특정 컴파일러를 테스트하지 않고 결정하는 방법은 없습니다.

그러나 for(;;)다음과 같은 이유로 선호 합니다.

  • 내가 사용한 많은 컴파일러는 적절한 경고 수준 설정으로 while (true)에 대한 상수 식 경고를 생성합니다.

  • 귀하의 예에서 매크로 TRUE는 예상대로 정의되지 않을 수 있습니다

  • 무한의 여러 가지 변형이있다 While 루프 등 while(1), while(true), while(1==1)등; 그래서 for(;;)가능성이 큰 일관성을 초래할 것입니다.


TRUE는 #DEFINE TRUE 1되지 않을 수도 있습니다,하지만 어떤 코드베이스가되는 while(TRUE)등의 평가 while(0)에서 이익을 가능성이 없습니다 for(;;).
저스틴

@Justin : 나는 그것이 참으로 거칠다는 것에 동의하고, 세 가지 주장 중 가장 강력하지는 않지만 Bjarne Stoustrup은 C ++에서 NULL 매크로를 피하기 위해 비슷한 주장을 사용합니다. while(true)어쨌든 선호해야합니다. C ++에서는 C boolstdbool.h에 C가 예약되어 있으며 (C에서는 덜 안전합니다). for(;;)모든 의심을 제거합니다.
Clifford

5
for(;;Sleep(50))
{
    // Lots of code
}

다음보다 명확합니다.

while(true)
{
    // Lots of code
    Sleep(50);
}

를 사용하지 않는 경우에는 적용되지 않습니다 Sleep().


1
코드가 잘못
ST3

12
@ ST3-그렇습니다. 내 코드는 끔찍하다. 다음에 무한 루프를 만들 때 더 열심히 노력해야합니다.
Armada

1
@Frammo-운영 체제에 따라 다르지만 일반적으로timerService.scheduleRepeating (50, [] () { /* lots of code */ });
Periata Breatta

2
for 루프 내에서 sleep 같은 함수를 호출하는 것에 대해서는 아무 것도 명확하지 않습니다.
Greg

1
OMG, timerService.scheduleRepeating (50, [] () {})은 입력하고 이해하기가 훨씬 쉬우 며 sleep (50)입니다.
Cool Javelin

4

"영구"루프는 임베디드 시스템에서 백그라운드 루프로 널리 사용됩니다. 어떤 사람들은 그것을 다음과 같이 구현합니다.

for (; ;)
{
 // Stuff done in background loop
}

때로는 다음과 같이 구현됩니다.

while (TRUE /* or use 1 */)
{
 // Stuff done in background loop
}

그리고 또 다른 구현은 다음과 같습니다.

do
{
 // Stuff done in background loop
} while (1 /* or TRUE */);

최적화 컴파일러는 이러한 조각에 대해 동일하거나 유사한 어셈블리 코드를 생성해야합니다. 한 가지 중요한 참고 사항 : 루프 실행 시간은 큰 문제가되지 않습니다. 이러한 루프는 계속 진행되므로 처리 섹션에서 더 많은 시간이 소요됩니다.


8
컴파일러가 다른 코드를 생성하면 컴파일러를 버리고 지난 20 년 동안 코드를 가져와야합니다.
GManNickG

5
"이러한 루프 영원히 갈 이후 루프의 실행 시간은 큰 문제가되지 않습니다"- 그 소리 때문에 내가 .. 잘못
Blindy

3
@Blindy - 잘못이기 때문에, 무엇을 우려 것은 무한되는 루프에 의해 도움이된다 어느 것도 루프 로직을 처리하는 동안 런타임의 비율, 또는 유용한 작업의 단위 당 논리를 반복의 양이있다
벤 보이트

3

while (true)가 for (;;)보다 읽기 쉽다고 가정합니다. 프로그래머가 for 루프에서 무언가를 놓친 것 같습니다 :)


나는 속도에 관심이있다. 특히 내 코드에 무한한 영향을 미치는 최적화가있는 경우.
Kowalski

2

"for (;;)"를 사용하는 가장 중요한 이유는 탐색 적 프로그래밍을 수행 할 때 "while (TRUE)"를 사용하는 것에 대한 두려움 때문입니다. "for"를 사용하면 반복되는 양을 쉽게 제어 할 수 있고 "for"루프를 무한대로 쉽게 변환 할 수 있습니다.

예를 들어, 재귀 함수를 구성하는 경우 무한 루프로 변환하기 전에 함수 호출 횟수를 제한 할 수 있습니다.

    for(int i=0;i<1000;i++) recursiveFunction(oneParam);

내 기능이 확실하면 무한 루프로 변환합니다.

    for(;;) recursiveFunction(oneParam);

3
첫 번째 루프에는 구문 오류가 있습니다 (세미콜론 누락).
Jens

3
하아! 이에 의해 for (;;);)의 단점을 보여줌
Andrew
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.