Quick Syntax
반복문은 횟수, 종료 조건, 최소 한 번 실행 여부 중 무엇이 먼저 보이는지에 따라 고릅니다. 어느 형태든 경계와 상태 갱신이 실제로 맞물리는지가 더 중요합니다.
#include <stddef.h>
#include <stdio.h>
/* 횟수·인덱스가 보이면 for */
int scores[] = {90, 85, 100};
size_t len = sizeof(scores) / sizeof(scores[0]);
int sum = 0;
for (size_t i = 0; i < len; i++) {
sum += scores[i];
}
/* 종료 조건을 먼저 검사하면 while */
int ch;
while ((ch = getchar()) != '\n' && ch != EOF) {
/* 입력을 한 문자씩 처리 */
}
/* 본문을 한 번 실행한 뒤 검사하면 do-while */
int attempts = 0;
do {
attempts++;
} while (attempts < 3);문법
for (init; condition; step) {
/* 반복 본문 */
}
while (condition) {
/* 반복 본문 */
}
do {
/* 반복 본문 */
} while (condition);for는 배열 순회처럼 횟수와 인덱스가 드러나는 곳에 잘 맞습니다. while은 파일 끝, 입력 상태, 연결 리스트 끝처럼 종료 조건이 중심일 때 읽기 쉽습니다. do-while은 메뉴 표시나 재시도처럼 본문을 최소 한 번 실행해야 할 때만 씁니다.
세 식은 모두 생략할 수 있습니다. 특히 for (;;)는 의도적인 무한 반복이고, 눈에 보이는 break 또는 return 탈출 경로가 있어야 합니다. C99 이상에서는 for (size_t i = 0; ...)의 i가 반복문 범위 안에만 남습니다.
흐름 제어
break는 가장 안쪽 반복문 하나를 끝내고, continue는 가장 안쪽 반복문의 이번 회차를 건너뜁니다.
for (size_t i = 0; i < len; i++) {
if (scores[i] < 0) {
continue;
}
if (scores[i] == target) {
break;
}
}중첩 반복을 한꺼번에 탈출하려고 break를 여러 개 기대하면 안 됩니다. 함수로 분리하거나, 탈출 상태를 명시적으로 전달하는 편이 흐름을 읽기 쉽습니다.
입력 재시도는 do-while만으로 안전해지지 않습니다. scanf가 실패하면 잘못된 토큰이 입력 스트림에 남으므로, 반환값을 확인하고 입력을 정리하거나 줄 단위로 읽어 파싱해야 합니다. 입력 세부 처리는 scanf와 입력 버퍼 카드에서 다룹니다.
주의할 점
- 길이가
n인 배열의 유효 인덱스는0부터n - 1까지이므로 기본 조건은i < n입니다. while의 조건에 쓰인 값이 본문에서 실제로 바뀌는지 확인합니다.continue가 증가나 상태 갱신을 건너뛰게 만들면 무한 반복이 될 수 있습니다.- 반복문의 목적이 한 문장으로 설명되지 않을 만큼
break와continue가 많아지면, 조건이나 함수 분리를 다시 검토합니다.
참고 링크
3 sources