본문 바로가기
IT/C++(CPP)

CPP 초급 강좌 18. C++ if init, if constexpr, rang for

by 신림83 2020. 10. 28.
반응형

CPP 초급 강좌 18. C++ if init, if constexpr, rang for

if init

 C++17 부터 추가된 기능으로 조건문을 만들 때, 초기화 구문을 추가할 수 있게 되었다.

아래 코드를 보자.

int f1() {return 0;}

int main()
{
	int n = f1();
	if (n == 0)
	{
		//작업
	}
}

위 코드를 if init 적용을 해보자.

int f1() {return 0;}

int main()
{
	if (int n = f1() ; n == 0)
	{
		//작업
	}
}

이와 같은 표현이 가능하다. 

이런 표현이 어떤 이점이 있을까? int n = f1(); if 문 외부에 있다면, main 전역에서 변수가 생명력을 가지지만 if init을 통해 성성된 변수는 if문 안에서만 생명력을 가지는 이점이 있다. 

 

switch에도 적용가능하다.

int f1() {return 0;}

int main()
{
	switch (int n = f1() ; n)
	{
	}
}

 

if constexpr

if 조건문을 일반적으로 실행시간에 코드를 조사한다. C++17 부터 추가된 if constexpr 기능은 컴파일 시간에만 조사가 가능하다. 컴파일 시간에 비교하지 못하면 애러다. static if

int main()
{
	int n = 10;

	if (n == 10)
	{

	}
	
	if constexpr (n == 10) //불가. 컴파일 시간에 조사 불가
	{
	
	}

	if constexpr (5 == 10) //가능 컴파일 시간에 알수 있다.
	{

	}
}

 이와 같은 기술은 템플릿 프로그래밍등에서, 내부에서 T가 포인터일때는 코드생성을 하고, 아닐때는 코드생성을 하지 않고 요런 곳에서 사용하곤 한다. 

 

range for

c++11 부터 지원되는 새로운 반복문 형식이다. 

int main()
{
	int arr[7] = { 1,22,33,4,5,6,7 };

	for (int i = 0; i < 7; i++)
	{
		cout << arr[i] << endl;
	}
}

 

기존을 for문은 이런 식으로 사용했다고 하면, range for을 사용한다면 아래와 같이 표현 가능하다.

int main()
{
	int arr[7] = { 1,22,33,4,5,6,7 };

	for (auto n : arr)
	{
		cout << n << endl;
	}
}

for (auto n : arr) 을 사용하면 if 문 영역에서 n이 순차적으로 들어온다. 위의 예제와 같은 동작을 보장한다.

 

해당 기능은 배열에만 사용하는 것이 아닌 STL 등 다양한 컨테이너들을 지원하고(list, vector, set)등, 커스텀하게 자신이 만든 형식에도 사용할 수 있다.

 

배우자. 배우면 남는다.

 봐주셔서 감사합니다.

반응형

댓글