for (;;) {
//Something to be done repeatedly
}
나는 이런 종류의 일이 많이 사용되는 것을 보았지만 다소 이상하다고 생각합니다 … 말하기 while(true)
또는 그 선을 따라 뭔가 가 더 명확하지 않습니까?
나는 (많은 프로그래머가 암호 코드에 의지하는 이유와 같이) 이것이 작은 마진이 더 빠르다고 추측하고 있습니까?
왜, 그리고는 정말 가치? 그렇다면 다음과 같이 정의하십시오.
#define while(true) for(;;)
참조 : while (1) 또는 while (2) 중 어느 것이 더 빠릅니까?
답변
- 더 빠르지 않습니다.
- 정말로 관심이 있다면 플랫폼에 대한 어셈블러 출력으로 컴파일하고 확인하십시오.
- 중요하지 않습니다. 이것은 중요하지 않습니다. 당신이 원하는대로 무한 루프를 작성하십시오.
답변
나는 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 루프의 제어식이 상수 일 때 일부 컴파일러가 경고를 발행한다는 것을 기억합니다. 나는 그것이 너무 많이 발생한다고 생각하지 않지만, 가짜 경고의 가능성만으로도 그것을 피하고 싶을 정도로 충분합니다.