for
loop
조건부로 문을 반복적으로 실행하며, 문이 루프 조건을 관리할 필요가 없습니다.
목차 |
구문
attr
(선택 사항)
for (
init-statement
condition
(선택 사항)
;
expression
(선택 사항)
)
statement
|
|||||||||
| attr | - | (C++11부터) 임의의 개수의 속성 | ||
| init-statement | - |
다음 중 하나
모든 init-statement 는 세미콜론으로 끝나야 합니다. 이것이 흔히 비공식적으로 세미콜론 뒤에 오는 표현식이나 선언으로 설명되는 이유입니다. |
||
| condition | - | 조건 | ||
| expression | - | 표현식 (일반적으로 루프 카운터를 증가시키는 표현식) | ||
| statement | - | 문 (일반적으로 복합 문) |
조건
조건은 condition 은 expression 이거나 simple declaration 일 수 있습니다.
|
(since C++26) |
- 만약 문법적으로 표현식으로 해결될 수 있다면, 표현식으로 취급됩니다. 그렇지 않으면 선언으로 취급됩니다 (이는 구조적 바인딩 선언이 아닌 선언임) (C++26부터) .
제어가 조건에 도달하면, 조건은 값을 산출하며, 이 값은 statement 가 실행될지 여부를 결정하는 데 사용됩니다.
표현식
만약 condition 이 표현식인 경우, 생성되는 값은 해당 표현식이 bool 으로 문맥상 변환된 값입니다. 해당 변환이 잘못된 경우, 프로그램은 잘못된 형식입니다.
선언
만약 condition 이 단순 선언인 경우, 반환되는 값은 결정 변수의 값(아래 참조)이 bool 으로 문맥상 변환된 값입니다. 해당 변환이 적합하지 않은 경우, 프로그램은 부적합합니다.
비구조적 바인딩 선언
선언에는 다음과 같은 제한 사항이 있습니다:
- 구문적으로 다음 형식을 따릅니다:
|
(C++11 이전) |
|
(C++11 이후) |
- 선언자는 함수 나 배열 을 지정할 수 없습니다.
- 타입 지정자 시퀀스 (C++11 이전) 선언 지정자 시퀀스 는 타입 지정자와 constexpr 만 포함할 수 있으며, (C++11 이후) 클래스 나 열거형 을 정의할 수 없습니다.
선언의 결정 변수는 선언된 변수입니다.
구조화된 바인딩 선언선언에는 다음과 같은 제한 사항이 있습니다:
선언의 결정 변수는 선언에 의해 도입된 e 라는 발명된 변수입니다. |
(C++26부터) |
설명
다음과 동등한 for 문:
{
|
|||||||||
다만
- init-statement 의 범위와 condition 의 범위는 동일합니다.
- statement 의 범위와 expression 의 범위는 서로 분리되어 있으며 init-statement 와 condition 의 범위 내에 중첩되어 있습니다.
- statement 내에서 continue statement 를 실행하면 expression 이 평가됩니다.
- 비어 있는 condition 은 true 와 동일합니다.
루프가 statement 내에서 종료되어야 하는 경우, break statement 를 종료 문으로 사용할 수 있습니다.
현재 반복을 statement 내에서 종료해야 하는 경우, continue statement 를 단축키로 사용할 수 있습니다.
참고 사항
while
루프의 경우와 마찬가지로,
statement
가 복합 문(compound statement)이 아닌 경우, 그 안에서 선언된 변수의 범위는 마치 복합 문인 것처럼 루프 본문으로 제한됩니다.
for (;;) int n; // n이 스코프를 벗어남
C++ 진행 보장 의 일부로서, 사소한 무한 루프 가 아닌 (C++26부터) 관찰 가능한 동작 이 없는 루프가 종료되지 않으면 동작은 정의되지 않음 입니다. 컴파일러는 이러한 루프를 제거할 수 있습니다.
C에서는 init-statement 와 condition 범위에서 선언된 이름들이 statement 범위에서 가려질(shadowed) 수 있지만, C++에서는 이것이 금지됩니다:
for (int i = 0;;) { long i = 1; // 유효한 C, 유효하지 않은 C++ // ... }
키워드
예제
#include <iostream> #include <vector> int main() { std::cout << "1) 단일 문장을 본문으로 하는 일반적인 루프:\n"; for (int i = 0; i < 10; ++i) std::cout << i << ' '; std::cout << "\n\n" "2) 초기화 문장은 동일한 선언 지정자 시퀀스를 사용할 수 있는 한\n" "여러 이름을 선언할 수 있습니다:\n"; for (int i = 0, *p = &i; i < 9; i += 2) std::cout << i << ':' << *p << ' '; std::cout << "\n\n" "3) 조건은 선언일 수 있습니다:\n"; char cstr[] = "Hello"; for (int n = 0; char c = cstr[n]; ++n) std::cout << c; std::cout << "\n\n" "4) 초기화 문장은 auto 타입 지정자를 사용할 수 있습니다:\n"; std::vector<int> v = {3, 1, 4, 1, 5, 9}; for (auto iter = v.begin(); iter != v.end(); ++iter) std::cout << *iter << ' '; std::cout << "\n\n" "5) 초기화 문장은 표현식일 수 있습니다:\n"; int n = 0; for (std::cout << "루프 시작\n"; std::cout << "루프 테스트\n"; std::cout << "반복 " << ++n << '\n') { if (n > 1) break; } std::cout << "\n" "6) 루프 본문에서 생성된 객체의 생성자와 소멸자는\n" "각 반복마다 호출됩니다:\n"; struct S { S(int x, int y) { std::cout << "S::S(" << x << ", " << y << "); "; } ~S() { std::cout << "S::~S()\n"; } }; for (int i{0}, j{5}; i < j; ++i, --j) S s{i, j}; std::cout << "\n" "7) 초기화 문장은 구조화된 바인딩을 사용할 수 있습니다:\n"; long arr[]{1, 3, 7}; for (auto [i, j, k] = arr; i + j < k; ++i) std::cout << i + j << ' '; std::cout << '\n'; }
출력:
1) 단일 문장을 본문으로 하는 일반적인 루프: 0 1 2 3 4 5 6 7 8 9 2) 초기화 문장은 동일한 선언 지정자 시퀀스를 사용할 수 있는 한 여러 이름을 선언할 수 있습니다: 0:0 2:2 4:4 6:6 8:8 3) 조건은 선언일 수 있습니다: Hello 4) 초기화 문장은 auto 타입 지정자를 사용할 수 있습니다: 3 1 4 1 5 9 5) 초기화 문장은 표현식일 수 있습니다: 루프 시작 루프 테스트 반복 1 루프 테스트 반복 2 루프 테스트 6) 루프 본문에서 생성된 객체의 생성자와 소멸자는 각 반복마다 호출됩니다: S::S(0, 5); S::~S() S::S(1, 4); S::~S() S::S(2, 3); S::~S() 7) 초기화 문장은 구조화된 바인딩을 사용할 수 있습니다: 4 5 6
참고 항목
range-
for
loop
(C++11)
|
범위에 대한 루프 실행 |
|
C 문서
for
for
|
|