무엇을 하는 것인가
for (초기식; 조건식; 증감식) — 세 칸이 각각 어디서 시작해서 / 언제까지 / 얼마씩입니다. for (int i = 0; i < 5; i++)는 "0에서 시작해 5보다 작은 동안 1씩 늘리며" 돕니다.
0부터 시작하고 <로 끝내는 것이 C의 관례입니다. i < 5면 0,1,2,3,4로 정확히 다섯 번 돕니다. 배열의 번호가 0부터라 이렇게 맞춰 두면 배열[i]가 그대로 들어맞습니다.
여기서 하나 차이 오류(off-by-one)가 나옵니다. 크기 5인 배열에 i <= 5로 돌면 배열[5]를 건드리는데, C는 이걸 막지 않습니다. 컴파일도 되고 실행도 되다가 엉뚱한 값이 나오거나 갑자기 죽습니다. 파이썬처럼 친절히 오류를 내주지 않으니 조건식을 직접 확인해야 합니다.
반복 횟수가 정해져 있으면 for, 조건이 끝날 때까지면 while입니다. break는 반복을 통째로 그만두고, continue는 이번 회차만 건너뜁니다.
예제 코드
아래 코드가 위 버튼으로 받는 파일과 같은 내용입니다. 통째로 복사해 실행해 보고, 값을 바꿔 가며 결과가 어떻게 달라지는지 보는 편이 읽기만 하는 것보다 훨씬 빨리 익습니다.
/* for 반복문 — 세 칸의 뜻과 하나 차이 오류
컴파일: gcc c-for.c -o cfor -Wall */
#include <stdio.h>
int main(void)
{
/* 시작 ; 조건 ; 증가 — 0 부터, < 로 끝내는 것이 관례입니다 */
for (int i = 0; i < 5; i++) {
printf("i = %d\n", i); /* 0,1,2,3,4 — 정확히 다섯 번 */
}
/* 1 부터 n 까지 세고 싶으면 <= 를 씁니다 */
int n = 5;
int 합 = 0;
for (int i = 1; i <= n; i++) {
합 += i;
}
printf("1부터 %d까지 합: %d\n", n, 합);
/* 구구단 — 이중 반복 */
for (int 단 = 2; 단 <= 3; 단++) {
for (int 곱 = 1; 곱 <= 9; 곱++) {
printf("%d x %d = %2d\n", 단, 곱, 단 * 곱);
}
printf("----\n");
}
/* break 는 통째로 그만, continue 는 이번 회차만 건너뛰기 */
for (int 수 = 1; 수 <= 10; 수++) {
if (수 % 2 == 0) {
continue; /* 짝수는 건너뛴다 */
}
if (수 > 7) {
break; /* 7 을 넘으면 아예 그만둔다 */
}
printf("홀수: %d\n", 수); /* 1, 3, 5, 7 */
}
/* 거꾸로 세기 */
for (int i = 3; i > 0; i--) {
printf("%d... ", i);
}
printf("시작!\n");
/* ── 하나 차이 오류 ──
크기 5 인 배열에 i <= 5 로 돌면 배열[5] 를 건드립니다.
C 는 막지 않습니다. 컴파일도 되고 실행도 되다가 엉뚱한 값이 나옵니다. */
int 점수[5] = {90, 85, 77, 68, 94};
for (int i = 0; i < 5; i++) { /* <= 5 로 쓰면 안 됩니다 */
printf("점수[%d] = %d\n", i, 점수[i]);
}
/* 배열 크기를 직접 세지 말고 이렇게 구하면 실수가 줄어듭니다 */
int 개수 = (int)(sizeof(점수) / sizeof(점수[0]));
printf("원소 개수: %d\n", 개수);
return 0;
}
기억할 것
for (int i = 0; i < n; i++)— 시작 · 조건 · 증가.- 0부터,
<로 끝내기. 배열 번호와 그대로 맞습니다. i <= n으로 쓰면 한 칸을 더 건드립니다. C는 안 막아줍니다.for (...);— 여기도 세미콜론을 찍으면 빈 반복이 됩니다.break통째로 그만 ·continue이번만 건너뛰기.
자주 묻는 것
반복이 한 번 더 돌거나 한 번 덜 돕니다
조건식의 <와 <=를 보세요. n번 돌리려면 i = 0; i < n입니다. 1부터 n까지 세고 싶으면 i = 1; i <= n입니다. 둘을 섞으면 하나씩 어긋납니다.
for 안에서 선언한 i 를 밖에서 못 씁니다
for (int i = ...)로 선언하면 그 반복문 안에서만 삽니다. 밖에서도 써야 하면 for 앞에서 int i;로 선언하세요. 옛 C(C89)에서는 for 괄호 안 선언이 안 되니 컴파일 오류가 나면 -std=c11을 확인하세요.
무한 루프를 만들려면요
for (;;) 또는 while (1)입니다. 안에서 break로 빠져나오게 만드세요. 증감식을 빠뜨려서 실수로 무한 루프가 되는 경우가 더 흔하니, 프로그램이 안 끝나면 증감식부터 보세요.
이중 for 에서 안쪽만 그만두려면요
break는 자기가 속한 반복문 하나만 빠져나옵니다. 바깥까지 한꺼번에 나가려면 깃발 변수를 두거나 그 부분을 함수로 빼서 return하는 편이 깔끔합니다.