for (;;)와 while (1)을 사용하는 것에는 차이가 있습니까?


대답 1:

생성 된 코드와 관련하여 최신 C 컴파일러는 동일한 결과를 제공해야합니다.

(;;)에 대해 더 많은 오버 헤드를 생성한다고 말한 저자, 교수 및 다른 사람들은 (a) 자신이 무슨 말을하는지 알지 못하거나 (b) 고대 또는 깨진 컴파일러와 협력하고 있습니다. for (;;) 루프 조건의 스테핑이없고 조건이 없기 때문에 추가 오버 헤드가 발생하지 않습니다. 그렇다면 고대의 최적화되지 않은 컴파일러의 (1)은 실제로 각 반복의 맨 위에 1이 0이 아닌지 여부를 확인하기 때문에 실제로 더 많은 오버 헤드를 생성 할 수 있습니다. 현대의 컴파일러는 이것을하지 않을 것입니다.

일부 컴파일러 구현에서 경고 수준을 충분히 높이거나 보푸라기 같은 유틸리티를 사용하면 while (1) 또는 이에 상응하는 경고가 표시 될 수 있습니다. 즉, 조건식과 같은 것이 일정합니다. for (;;)는 조건식이 없기 때문에 그러한 경고를 생성하지 않습니다. 나는 우리가 제로 경고로 컴파일하고 싶었던 프로젝트를 연구했으며 따라서 (1;) 대신 (;;) 대신 사용하기로 선택했습니다. 또한 for (;;)는 while 변형보다 쉽게 ​​검색 할 수 있습니다.

그건 그렇고, 당신이 잠시 동안 사용한다면, 다음과 같이 말하기가 더 읽기 쉽습니다.

동안 (참)

말하는 것보다 :

동안 (1)

전자는 더 많은 타이핑이 필요하지만.

현대 C에서는 (즉, 1999 년 C99 이후) TRUE 버전을 만들지 않아야합니다. 대신 stdbool.h 헤더 파일을 포함 시키면 키워드 _Bool을 사용하지 않고 정의 된 bool 데이터 유형 및 true 및 false 기호에 액세스 할 수 있습니다. 자신의 참 / 거짓 값을 굴리는 것은 그렇게…

… 1998.


대답 2:

표준 : 표준 C ++

6.5.3 for 문 1 (for-init-statement conditionopt; expressionopt) 문의 for 문은 [code] {for-init-statement while (condition) {statement expression; }} [/ code] for-init-statement에서 선언 된 이름은 조건에서 선언 된 것과 동일한 선언 영역에 있으며, continue in 문 (다른 반복문에 포함되지 않음)이 re 전에 표현식을 실행한다는 점을 제외하고 평가 조건. [참고 : 따라서 첫 번째 명령문은 루프의 초기화를 지정합니다. 조건 (6.4)은 각 반복 전에 수행되는 테스트를 지정하여 조건이 거짓이 될 때 루프가 종료되도록합니다. 식은 종종 각 반복 후에 수행되는 증분을 지정합니다 .— end note] 2 조건과 식 중 하나 또는 둘 다를 생략 할 수 있습니다. 누락 된 조건은 암시 적 절을 while (true)와 동일하게 만듭니다.

아마도


대답 3:

그 가치가있는 컴파일러는 두 경우 모두 동일한 코드를 생성합니다.

for (;;) 옵션에 대한 한 가지 가능한 선호 사항은 일부 (많은?) 사람들이 코드에서 숫자 상수를 사용하는 것이 "나쁜 스타일"이라고 생각한다는 것입니다. 즉, 당신은 쓰지 않습니다

x + = 10;

하지만 당신은 작성

정적 const int my_constant_value = 10;

(...)

x + = my_constant_value;

그 이유는 모든 숫자 상수가 명시 적으로 선언되어 있고 파일 전체에 분산되지 않고 소스 파일의 시작 부분에 선언되어 유지 관리가 더 용이하기 때문입니다.

for (;;) vs while (1)과 관련하여 분명히 차이는 없지만, 숫자가없는 코드에서 '1'을 보는 것은 여전히 ​​불편합니다.

C ++에서 (그리고 C99 이후 C에서도) "while (true)"를 쓸 수 있지만 "while (1)"보다 훨씬 길다. "while (1)"자체보다 "for (;;)보다 1 자 더 길다 ".