for 루프
for 루프 (for loop)
루프를 실행해요. while 루프의 더 짧은 대용 형태로 쓰여요.
출처: cppreference
본문
문법 (Syntax)
attr-spec-seq(C23부터, 선택) for ( init-clause ; cond-expression ; iteration-expression ) loop-statement
설명 (Explanation)
for 루프는 다음과 같이 동작해요.
- init-clause(초기화 절)는 표현식이거나(C99부터) 선언일 수 있어요.
- 표현식인 init-clause는 cond-expression을 처음 평가하기 전에 한 번 평가되고, 그 결과는 버려져요.
- (C99부터) 선언인 init-clause는 루프 본문 전체에서 스코프 안이에요. init-clause의 나머지, cond-expression 전체, iteration-expression 전체, loop-statement 전체가 다 포함돼요. 이 선언에서 선언된 변수에는
auto와register저장 클래스 지정자만 허용돼요. - cond-expression(조건 표현식)은 루프 본문보다 먼저 평가돼요. 그 결과가 0이면 루프 문을 즉시 빠져나가요.
- iteration-expression(반복 표현식)은 루프 본문 뒤에 평가되고 그 결과는 버려져요. 평가한 뒤 제어는 cond-expression으로 넘어가요.
init-clause, cond-expression, iteration-expression은 모두 선택이에요. cond-expression을 생략하면 0이 아닌 정수 상수로 대체돼서 루프가 끝나지 않아요.
for(;;) {
printf("endless loop!");
}
loop-statement는 선택이 아니지만, 널 문장(null statement)일 수는 있어요.
for(int n = 0; n < 10; ++n, printf("%d\n", n))
; // null statement
루프 실행을 어떤 지점에서 끝내야 한다면, loop-statement 안 어디서든 break 문을 쓸 수 있어요.
loop-statement 안 어디서든 쓴 continue 문은 제어를 iteration-expression으로 넘겨요.
무한 루프 프로그램은, cond-expression·iteration-expression·loop-statement 어느 부분에도 관찰 가능한 동작(I/O, volatile 접근, 원자 또는 동기화 연산)이 없다면, 정의되지 않은 동작이 돼요. 이 덕분에 컴파일러는 종료함을 증명하지 않고도 관찰 불가능한 모든 루프를 최적화로 제거할 수 있어요. 단 예외가 있어요: cond-expression을 생략했거나 상수 표현식인 루프는 예외고, for(;;)는 항상 무한 루프예요.
(C99부터) 다른 모든 선택·반복 문과 마찬가지로 for 문도 블록 스코프를 만든다는 특징이 있어요. init-clause·cond-expression·iteration-expression에서 도입한 식별자는 loop-statement를 지나면 스코프를 벗어나요.
(C23부터) attr-spec-seq는 for 문에 적용되는 선택적 속성 목록이에요.
참고 (Notes)
loop-statement로 쓰인 표현식 문은 C++와 달리 init-clause의 스코프와 구별되는 자기만의 블록 스코프를 만들어요.
for (int i = 0; ; ) {
long i = 1; // valid C, invalid C++
// ...
}
goto로 루프 본문에 들어가는 것도 가능해요. 이렇게 들어가면 init-clause와 cond-expression은 실행되지 않아요. (제어가 루프 본문 끝에 도달하면 cond-expression 실행을 포함해 반복이 일어날 수 있어요.)
예시
#include <stdio.h>
#include <stdlib.h>
enum { SIZE = 8 };
int main(void)
{
int array[SIZE];
for(size_t i = 0 ; i < SIZE; ++i)
array [i] = rand() % 2;
printf("Array filled!\n");
for (size_t i = 0; i < SIZE; ++i)
printf("%d ", array[i]);
putchar('\n');
}
출력:
Array filled!
1 0 1 1 1 1 0 0
더 알아보기
while과do루프 문서를 함께 보면 반복문의 전체 그림이 나와요.break와continue가 루프 제어를 어떻게 바꾸는지도 이어서 확인하면 좋아요.- cppreference의 for 루프 원문에서 C++의
for와 비교해 볼 수 있어요.