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

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

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

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

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

#define while(true) for(;;)

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



답변

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

답변

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

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

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

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

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


답변

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


답변

데니스 리치 때문에

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

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

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

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


답변

제정신 컴파일러에서 확실히 빠르지는 않습니다. 둘 다 무조건 점프로 컴파일됩니다. 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


답변

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

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

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


답변

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

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

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

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