Namespaces
Variants

for loop

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
for
range- for (C++11)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

조건부로 문을 반복적으로 실행하며, 문이 루프 조건을 관리할 필요가 없습니다.

목차

구문

attr  (선택 사항) for ( init-statement condition  (선택 사항) ; expression  (선택 사항) ) statement
attr - (C++11부터) 임의의 개수의 속성
init-statement - 다음 중 하나
(C++23부터)

모든 init-statement 는 세미콜론으로 끝나야 합니다. 이것이 흔히 비공식적으로 세미콜론 뒤에 오는 표현식이나 선언으로 설명되는 이유입니다.

condition - 조건
expression - 표현식 (일반적으로 루프 카운터를 증가시키는 표현식)
statement - (일반적으로 복합 문)

조건

조건은 condition expression 이거나 simple declaration 일 수 있습니다.

  • 구문적으로 structured binding 선언으로 해결될 수 있는 경우, 이는 structured binding 선언으로 해석됩니다.
(since C++26)
  • 만약 문법적으로 표현식으로 해결될 수 있다면, 표현식으로 취급됩니다. 그렇지 않으면 선언으로 취급됩니다 (이는 구조적 바인딩 선언이 아닌 선언임) (C++26부터) .

제어가 조건에 도달하면, 조건은 값을 산출하며, 이 값은 statement 가 실행될지 여부를 결정하는 데 사용됩니다.

표현식

만약 condition 이 표현식인 경우, 생성되는 값은 해당 표현식이 bool 으로 문맥상 변환된 값입니다. 해당 변환이 잘못된 경우, 프로그램은 잘못된 형식입니다.

선언

만약 condition 이 단순 선언인 경우, 반환되는 값은 결정 변수의 값(아래 참조)이 bool 으로 문맥상 변환된 값입니다. 해당 변환이 적합하지 않은 경우, 프로그램은 부적합합니다.

비구조적 바인딩 선언

선언에는 다음과 같은 제한 사항이 있습니다:

  • 구문적으로 다음 형식을 따릅니다:
  • type-specifier-seq declarator = assignment-expression
(C++11 이전)
  • attribute-specifier-seq (선택 사항) decl-specifier-seq declarator brace-or-equal-initializer
(C++11 이후)

선언의 결정 변수는 선언된 변수입니다.

구조화된 바인딩 선언

선언에는 다음과 같은 제한 사항이 있습니다:

선언의 결정 변수는 선언에 의해 도입된 e 라는 발명된 변수입니다.

(C++26부터)

설명

다음과 동등한 for 문:

{
초기화-문
while ( 조건식 )
{
문장
표현식 ;
}

}

다만

  • 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++
    // ...
}

키워드

for

예제

#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