C 언어에는 세 가지 주요 반복 구조가 있습니다: for, while 및 do-while. 이들은 반복적 계산을 구현하고, 데이터 구조를 탐색하며, 배열 처리를 자동화할 필요에 의해 등장하게 되었습니다. 반복문의 문법은 초기 프로그래밍 언어(Algol, Fortran 등)에서 처음 등장하였고, 가독성과 흐름 관리를 증진시키기 위해 C 문법에 맞게 조정되었습니다.
문제의 역사
초기 프로그래머들은 반복 작업을 구성하기 위해 레이블과 goto를 사용했으며, 이로 인해 코드가 엉키게(스파게티 코드) 되는 문제가 발생했습니다. 1972년부터 C에서 구조적 반복문을 도입함으로써 반복과 프로그램 논리 기술 방법을 통일할 수 있었습니다.
문제
반복문의 주된 작업은 특정 작업이 몇 번 반복되어야 할지를 결정하고, 반복문에서의 탈출을 제어하는 것입니다. 반복 횟수를 미리 아는 여부, 본체의 최소 실행 여부 및 탈출 조건의 사전 계산 여부에 따라 적절한 반복문 유형을 선택하는 것이 중요합니다.
해결책
코드 예시:
#include <stdio.h> int main() { int i = 0; // while 반복문 예시 while (i < 3) { printf("while: %d\n", i); i++; } // for 반복문 예시 for (int j = 0; j < 3; j++) { printf("for: %d\n", j); } // do-while 반복문 예시 int k = 0; do { printf("do-while: %d\n", k); k++; } while (k < 3); return 0; }
주요 특징:
while(1)과 for(;;)의 차이는 무엇이며 무한 반복문에 대해 어느 쪽을 사용하는 것이 더 나은가요?
답변: 두 가지 모두 무한 반복문을 생성하며 동일한 기계 코드로 변환되어 성능 차이는 없습니다. 일반적으로 for(;;)를 사용하여 초기화, 조건 종료 및 진행 단계를 예상하지 않고 있다는 것을 명확히 나타냅니다.
for(;;) { // 무한 반복문 } // 또는 while(1) { // 무한 반복문 }
for 본체 안에서 반복 변수 값을 변경할 수 있으며, 어떤 일이 발생하나요?
답변: for 반복문 본체 내에서 반복 변수(예: i++)를 변경하면 예측할 수 없는 반복 횟수가 발생합니다. 이러한 변경은 읽는 이에게 혼란을 주고 디버깅을 어렵게 만듭니다.
for (int i = 0; i < 10; i++) { printf("%d\n", i); i += 2; // 비표준 스텝 변경! }
반복문 본체가 비어 있을 경우 어떻게 되며, 어떤 경우에 의미가 있나요?
답변: 비어 있는 반복문 본체는 허용되며 이벤트 발생 대기 또는 데이터 준비에 사용됩니다:
while(*src++ = *dst++); // '\0' 문자까지 문자열 복사
부정적인 케이스
프로젝트에서 본체 안에서 반복 변수 값을 변경하는 for를 사용하여 처리된 요소 수가 잘못되어 버그가 발생하고 디버깅이 어려운 결과가 나타났습니다.
장점:
단점:
긍정적인 케이스
외부에서 카운터를 변경하지 않고 고정 길이 배열을 순회하는 for 사용:
장점:
단점: