숏컷 코드
반복 횟수가 분명하면 for, 종료 조건이 핵심이면 while, 최소 한 번 실행해야 하면 do-while을 먼저 봅니다.
for (int i = 0; i < len; i++) {
sum += scores[i];
}
while ((ch = getchar()) != '\n' && ch != EOF) {
/* 버퍼 비우기 */
}
do {
retry();
} while (!done);문법
반복문은 초기화, 조건 검사, 상태 갱신을 어디에 두는지에 따라 for, while, do-while로 나뉩니다. for는 반복 구조를 한 줄에 모으고, while은 조건을 먼저 검사하고, do-while은 본문을 먼저 한 번 실행한 뒤 조건을 검사합니다.
for (init; condition; step) {
/* 반복 본문 */
}
while (condition) {
/* 반복 본문 */
}
do {
/* 반복 본문 */
} while (condition);아래 예시는 이 세 형태가 실제 코드에서 어떻게 쓰이는지 조금 더 정확하게 풀어 쓴 버전입니다.
for로 인덱스와 횟수를 드러내는 경우
for (int i = 0; i < len; i++) {
sum += scores[i];
}배열 순회, 카운터 기반 처리, N번 반복처럼 반복 구조를 한 줄에서 읽을 수 있을 때 가장 잘 맞습니다.
while로 종료 조건을 중심에 두는 경우
while ((ch = getchar()) != '\n' && ch != EOF) {
/* 버퍼 비우기 */
}입력 버퍼 비우기, 파일 끝까지 읽기, 특정 상태가 바뀔 때까지 기다리기처럼 "언제 멈추는가"가 핵심이면 while이 더 자연스럽습니다.
do-while로 본문을 먼저 한 번 실행하는 경우
do {
printf("양수를 입력하세요: ");
scanf("%d", &n);
} while (n <= 0);메뉴 루프, 입력 재시도처럼 본문을 먼저 돌리고 나중에 조건을 검사해야 할 때 씁니다.
반복 흐름
- 반복 횟수와 인덱스가 분명하면
for가 기본입니다. - 몇 번 도는지보다 언제 멈추는지가 중요하면
while이 자연스럽습니다. - 본문을 최소 한 번 실행해야 하면
do-while을 봅니다. break는 반복 자체를 끝내고,continue는 이번 회차만 건너뜁니다.- 반복문 버그의 핵심은 경계와 종료 조건입니다.
for (int i = 0; i < len; i++) {
if (scores[i] < 0) {
continue;
}
if (scores[i] == target) {
break;
}
}break와 continue는 필요할 때만 쓰는 편이 좋습니다. 둘이 많아질수록 반복 흐름을 따라가기가 어려워집니다.
주의할 점
오프-바이-원은 C 배열 버그의 가장 흔한 출발점입니다.
int arr[5] = {1, 2, 3, 4, 5};
for (int i = 0; i <= 5; i++) {
printf("%d\n", arr[i]);
}- 원소가 5개면 인덱스는
0부터4까지입니다.<=와<차이가 바로 범위 초과를 만듭니다. while에서는 종료 조건에 쓰인 값이 루프 안에서 실제로 바뀌는지 같이 확인해야 합니다.for (;;)같은 무한 루프는 의도가 분명할 때만 쓰고, 탈출 조건을 눈에 띄게 두는 편이 안전합니다.
참고 링크
2 sources