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 를 사용한다.

 

+ Recent posts