if문
-> if문으로 조건을 받아서 조건이 참일 경우 실행, 참이 아닐 경우 실행하지 않는다.
if(조건)
{
코드 블록
}
조건이 참일 경우 코드 블록을 수행
else if
-> if문으로 여러 조건을 검사 할 때 사용한다.
-> if 짝을 이루어야 하며, 혼자 존재할 수 없다.
-> 중복되는 동일한 조건이 있을 경우 우선적으로 참이 되는 if 또는 else if문만 수행한다.
if문 사용 시 주의 사항
#1 if와 else if 또는 else 사이에 코드라인이 올 수 없다.
-> 수행해야할 코드 라인이 한 줄일 경우 중괄호는 생략할 수 있다.
switch 문
-> 상수 조건 분기문
-> 정수로된 변수 또는 상수 조건을 받아서 상수로 분기한다.
switch(조건)
{
case 상수:
코드블럭 실행
break;
case 상수:
코드블럭 실행
break;
case 상수:
코드블럭 실행
break;
}
break란?
-> switch 또는 반복문 내부에서만 사용이 가능하다.
-> 코드 라인을 수행 중 break를 만나면 가장 가까운 switch 또는 반복문을 탈출한다.
default
-> if문의 else와 비슷하게 작동한다.
-> 분기할 상수가 없을 경우 default를 수행한다.
-> 가장 하단에 배치하는게 좋다.
switch(조건)
{
case 상수:
코드블럭 실행
break;
case 상수:
코드블럭 실행
break;
default:
잘못 입력
break;
}
switch case 문 끝에 break;를 넣지 않고 그 바로 아래 case 문의 코드를 실행하고 싶은 경우,
미리 정의해둔 FALLTHROUGH 매크로를 추가한다. 단, case 문 안에 코드가 없는 경우는 예외이다.
switch (n)
{
case 0:
Func();
FALLTHROUGH
case 1:
Func2();
break;
case 2:
case 3:
Func3();
break;
default:
break;
}
default case가 절대 실행될 일이 없는 경우, default case 안에 Assert(false); 란 코드를 추가한다.
Assert()는 직접 구현하면 그 안에서 릴리즈 빌드 시 최적화 힌트를 추가할 수 있다.
switch (type)
{
case 1:
...
break;
default:
Assert(false, "unknown type");
break;
}
특정조건이 반드시 충족되어야 한다고 가정하고 짠 코드 모든 곳에 assert를 사용한다.
assert는 복구 불가능한 조건이다.
assert는 릴리즈 빌드에서 __assume 키워드로 대체하여 컴파일러의 최적화에 도움이 된다.
__assume(0) 사용
switch (type)
{
case 1:
...
break;
default:
__assume(0);
break;
}
__assume(0)로 컴파일러는 case 명령문에 표시되지 않은 값이 있는지 여부를 테스트하는 코드를 생성하지 않는다 .
이 작업을 수행하려면 __assume(0)문이 기본 case 본문의 첫 번째 문이어야한다.
컴파일러는 런타임을 기반으로 코드를 생성하기 때문에 명령문 __assume내부 __assume의식이 런타임에 false 이면
해당 코드가 올바르게 실행되지 않을 수 있다.
런타임에 식이 항상 참인지 확실하지 않은 경우 assert함수를 사용하여 코드를 보호 할 수 있다.
#define ASSERT(e) ( ((e) || assert(__FILE__, __LINE__)), __assume(e) )
하지만, 이 사용은 assert컴파일러가 최적화를 수행하지 못하게한다.
그래서 다음과 같이 별도의 매크로를 사용할 수 있다.
#ifdef DEBUG
# define NODEFAULT ASSERT(0)
#else
# define NODEFAULT __assume(0)
#endif
default:
NODEFAULT;
가능한 Assert 대신 static_assert 를 사용한다.
'Programming > C++ Basic' 카테고리의 다른 글
C++ 난수(rand, srand) (0) | 2020.08.20 |
---|---|
C++ 반복문(for, while, do ~ while), goto 문 (0) | 2020.08.19 |
C++ 형변환 (0) | 2020.08.18 |
C++ 진수, 연산자 (0) | 2020.08.14 |
C++ 부호비트, 음수와 양수 변환, 아스키코드, 상수, 표기법 (0) | 2020.08.13 |