본문 바로가기
  • 쓸쓸한 개발자의 공부방
C++

[C++] range-for, if init, if constexpr

by 심찬 2021. 8. 12.

 

range-for

 

 - C++부터 지원하는 새로운 모양의 반복문

 - 배열 뿐 아니라 STL의 다양한 컨테이너 list, vector, set 등 사용이 가능하다.

 - auto와 같이 사용되는 경우가 많다.

#include <iostream>

int main()
{
    int x[10] = {1,2,3,4,5,6,7,8,9,10};
    
    
    for ( auto n : x )
    {
        std::cout << n << " , ";
    }
    
    
    /*
    for ( int i = 0; i < 10; i++)
    {
        std::cout << x[i] << ", ";
    }
    */
    
}

 

 


if init

 - c++ 17 부터 지원

 - 조건문을 만들 때 초기화 구문을 추가 할 수 있다.

#include <iostream>
int foo() { return -1;}

int main()
{
    /*    
    // 기존에 자주 사용하는 방식의 코드
    int ret = foo();
    
    if ( ret == -1 )
    {
        //....
    }
    */
    
    // if init 코드 (c++17부터 지원)
    if ( int ret = foo() ; ret == -1  )
    {
        std::cout << "print 1" << std::endl;
    }
    
    
    /*
    // 기존에 자주 사용하는 방식의 코드
    int n = foo();
    switch( n )
    {
    case 10: break;
    case 20: break;
    }
    */
    
    // if init 코드 (c++17부터 지원)
    switch( int n = foo(); n )
    {
    case 10: break;
    case 20: break;
    default : 
    std::cout << "print 2" << std::endl;
    }

}

C++17에서 Run 했을 때의 결과 : 

C++14에서 Run 했을 때의 결과 : 

 


if constexpr

 

일반적인 if문은 실행시간에 조건식을 조사

 - c++ 17 부터 지원

 - if constexpr은 컴파일 시간에 조건식을 조사

 - 조건식은 반드시 컴파일 시간에 값을 결정할 수 있어야 한다. (static if 라고도 불린다.)

 - 탬플릿을 만들 때 주로 사용함. (일반적인 코딩에서는 잘 사용하지 않음...)

int main()
{
    int n = 0;
    
    if ( n == 0 )
    {
        //....
    }
    
    /*
    if constexpr ( n == 0 ) // error
    {
        //....
    }
    */
    
    if constexpr ( sizeof(n) == 0 ) // ok..
    {
        //....
    }

}

 

 

if constexpr 가 템플릿에서 사용되는 쉬운 예제:

template<typename T> 
void foo(T a)
{
//    if ( 0 )           // 실행 중에 해당 조건이 체크됨. 컴파일 단계에서 if 안의 코드 수행 체크됨.

    if constexpr ( 0 )   // 컴파일 중에 해당 조건을 체크하기 때문에 *a = 0; 코드를 수행X
        *a = 0;
}

int main()
{
    int n = 0;

    foo(&n); // T : int*
    foo(n);  // T : int
}

 

 

 

 

댓글