아쥬나이, 외계에서 오다.

azunai.egloos.com

포토로그 마이가든



Switch Case 문과 if문의 차이 Develop.C++

오늘도 이어지는 C++ 공부

swtich case와 if문은 모두 조건 분기 구문이다.(이런건 다 알죠?)

차이점
1. C++에서의 switch case문은 조건값으로 상수만 받을 수 있다.

2. swtich case문은 내부적으로 Mapping 가능한 점핑 테이블을 만든다. 그리고 이 값이 선형적으로 순차적일때 메모리를 적게 차지한다. 다수의 조건 분기가 있을때 코드가 깔끔해보이는 장점 이외에 swtich case문은 상수값들이 정렬되어 인덱싱 되어 있으므로 많이 나올수록 if보다 속도에 우위를 갖고 있다. 단 C++에서 if문을 연속적으로 썼을때 경우에 따라서 컴파일러가 이 부분을 테이블로 만들어 인덱싱 시켜주는 경우도 있으나 기본적으로 switch case의 속도가 더 빠르다고 생각하면 되겠음.
구문 예시)

const int hundred = 100; // const는 해당 변수를 상수로 선언한다.
int b;
cin >> b;
switch(b)
{
case 1 : case 2 :
    cout << "1이거나 2 이거나";
    break;
case hundred :
    cout << "100";
    break;
case default :
    break;
}

비트단위 논리연산자의 쓰임새 Develop.C++

#define STAND 1;
#define WALK 2;
#define ATTACK 4;
#define JUMP 8;

short STATUS;

//현재 상태를 stand 로 변경
STATUS |= STAND;

//현재 상태가 STAND인지를 추출
STATUS & STAND;

- 등 비트단위로 연산하여 정보를 적은 변수에 간단히 저장하는데 사용.
리눅스의 퍼미션등을 생각해도 될듯. 

&&와 ||연산자를 가지고 if문 구현 Develop.C++

#include <iostream>
using namespace std;
void main(void)
{
 int a=0, b=1, c=2;
 (a<b) && (b=c);
 cout << b << endl;
}

&&연산자와 ||연산자의 경우 첫번째 조건이 만족되면 두번째 연산을 실행하지 않는 특성이 있다.
a = (a>b) ? (10:20); 같은 연산 대신 사용할 수도 있음.

C++에서 전치증가 연산자와 후치증가 연산자의 차이점 Develop.C++

http://blog.naver.com/webocarina?Redirect=Log&logNo=140121396249

간지나게 글을 써보려 했는데 저기에 역 어셈블까지 되어서 친절하게 설명되어 있다. 
전치증가 연산자의 경우 연산을 위한 임시공간을 생성하지 않고 바로 변수에 연산을 수행한다는 얘기도 있으나, 
위 사이트의 역어셈블 결과만 놓고 본다면 똑같은 연산의 연산과정 차이이므로 연산 속도의 차이점은 없어 보인다. 
어차피 CPU에서 계산을 위해선 AX(어큐뮬레이터 레지스터)로 이동해야 하므로 계산을 위한 공간 할당의 차이는 없는것 같다. 

알고리즘적인 차이는 
int i=0, j=0, k=0;
j = i++;
k = ++i; 
라는 코드가 있을 때 결과적으로 i =1, j=0, k=1이 된다는것 정도. 값을 연산하고 대입하느냐 대입하고 연산하느냐의 차이라고 볼 수 있다. 
cout << i ++, cout << ++i 시에도 결과값이 서로 다르다. 


여담)
근데 질문.. 
마이너스는 보수를 생성하므로 더하기보다 연산이 느리다고 볼 수 있을텐데, 
int a = 1, b = -1, c = 0, d = 0;
c = a+b;
d = a-b;
두가지 연산은 속도가 뭐가 더 빠를까요?

1 2 3 4 5 6 7 8 9 10 다음