본문 바로가기

C++/C++ 문법

C++ if statement with initializer

728x90
728x90

본 게시글에서는 C++17부터 if문을 이용할 때 사용할 수 있는 문법을 소개한다.

 

어떤 정수 x의 값을 입력받고 10인지 확인하는 코드를 짠다고 해보자.

 

int x;
std::cin >> x;

if (x == 10)
{
  std::cout << "GOOD!\n";
}
else
{
  std::cout << "NO!\n";
}

 

위 코드에서는 cin으로 입력을 받고 if문으로 x가 10인지 확인하고 있다. C++17부터는 이런 코드를 좀 더 깔끔하게 작성하는 방법을 제공한다.

 

int x;

if (std::cin >> x; x == 10)
{
  std::cout << "GOOD!\n";
}
else
{
  std::cout << "NO!\n";
}

 

글의 제목에도 알 수 있듯이 if문에 초기화 구문을 포함시켜 선 초기화 후 조건문을 실행한다.

 

문법을 명시하면 다음과 같다.

 

if (init; condition)
{
  code block
}

 

if (int x = 10; x == 10)
{
  std::cout << "GOOD!\n";
}
else
{
  std::cout << "NO!\n";
}

// std::cout << x; ERROR!

 

if 문 내에서 생성된 변수는 임시 변수이므로 당연히 소속 코드 블록을 벗어나면 없어진다.

이거 왜 써?

사실 위의 경우만 보면 어처구니가 없다. 위에 제시한 예제는 굳이 이렇게 if를 쓰지 않아도 문제가 없기 때문이다.

 

initializer가 있는 if 문이 유용한 경우 중 하나는 thread에 lock을 걸 때이다.

 

void example_critical_section(std::mutex &mtx)
{
  if (std::unique_lock<std::mutex> loc(mtx, std::try_to_lock); loc.owns_lock())
  {
    std::cout << "MUTEX LOCK COMPLETE\n";
  }
  else
  {
    std::cout << "MUTEX LOCK FAILED\n";
  }
}

 

위처럼 mutex로 lock을 시도하는 코드를 짤 때 loc 변수에 대한 관리에 신경을 덜 쓰면서 내부 로직에 집중할 수 있다.

 

파이썬을 해본 사람이라면 with문과 유사하게 사용할 수 있음을 느낄 수 있을 것이다.

 

지금까지 C++17부터 사용이 가능한 if statement initializer의 문법을 배우고 적용 예를 알아보았다.

728x90
728x90

'C++ > C++ 문법' 카테고리의 다른 글

C++ Structured Binding(구조적 바인딩)  (0) 2021.10.30
C++ 람다 표현식 lambda expression  (0) 2021.09.03