본문 바로가기

C++

[TIL 3장] 형 변환, 증감/시프트 연산자, 분기문

오늘의 TIL 목차 (22.07.27)

 

  • 명시적 / 묵시적 형 변환
  • 증감 연산자 
  • 시프트 연산자 
  • 연산자 축약형
  • 분기문 - if문, switch문, (goto문)

명시적 형 변환, 묵시적 형 변환 (캐스팅)


int iA = 10;
float fTemp = 0;

fTemp = iA / 3; // 경고, int형을 float로 변환하는 과정에서 데이터 손실 위험

<묵시적 형 변환>
fTemp = iA / 3.f; // 컴퓨터가 알아서 int형을 메모리 공간이 더 큰 float형으로 형 변환

<명시적 형 변환>
fTemp = float(iA) / 3.f; // 프로그래머가 직접 형 변환을 지시, (float)iA도 가능

 

* 명시적 형 변환을 사용하는 것이 바람직

 

증감 연산자


단항 연산자 ( ++, --) 

  • 값을 하나 증가, 감소 시키는 연산자
  • 증감 연산자 사용 시 해당 변수의 값은 증감된 상태로 저장되어 있음 (변함)
  • ++iTemp; -> 전위 연산 : 해당 줄에서 바로 증감
  • iTemp++; -> 후위 연산 : 다음 줄에서 증감

연속 연산을 할 경우,

1. 연속 전위 연산 (++(++iTemp))

2. 선 전위 연산 뒤 후위 연산 ((++iTemp)++)

- 후위 연산이 먼저 오는 경우는 불가능

int iA(0), iB(0);

cout << (++iA) << endl; //1
cout << (iA++) << endl; //1
cout << (++iA) << endl; //3

cout << (++(++iB)) << endl; //2
cout << ((++iB)++) << endl; //3
cout << ((++iB)++) << endl; //5

 

시프트 연산자


시프트 연산자 ( <<, >> )

  • 비트 수를 이동시키는 연산자 (입출력 연산자로도 사용됨)
  • 시프트 연산자의 경우 비트 이동해도 실제 변수에 대입하지 않을 경우, 변수값 변경 없음.

 

왼쪽 시프트 연산자 (<<)

: 기존의 값에다가 2^n 제곱을 곱하는 결과와 같다.

6 << 1 : 6을 왼쪽으로 1칸 이동
-> 2^1 제곱만큼 곱해준 값이 됨

00000110 -> 00001100 == 12
6 * 2 == 12 // 2의 1승을 곱해준 값

 

오른쪽 시프트 연산자 (>>)

: 기존의 값에다가 2^n 제곱을 나누는 결과와 같다.

10 >> 3 : 10을 오른쪽으로 3칸 이동
-> 2^3 제곱만큼 나눠준 값이 됨

00001010 -> 00000001 == 1
10 / (2*2*2) == 1 // 2의 3승으로 나눈 값의 몫

 

* 왼쪽 시프트 연산자의 경우, 

int 메모리의 범위 (-128 ~ 127)을 넘어 오버 플로우가 발생할 수 있다.

unsigned int (0 ~ 255)를 사용하면 이를 예방할 수 있다.

 

#include <iostream>
#include <bitset>
...

	int iA = 10;
	unsigned int iB = 129; // 오버 플로우 방지

	cout << bitset<8>(iB) << endl;
	cout << "=====>>=====" << endl;
	cout << (bitset<8>(iB) >> 2) << endl;
	cout << iB << endl; // 위의 비트 이동과 관계 없이 iB는 그대로 129
	iB >>= 2; // 연산자 축약형, iB = iB >> 2;
	cout << iB << endl; // 대입했으므로 iB == 500으로 저장됨
	
    cout << "----" << endl;
	cout << (iA >> 2) << endl; // iA / 2^2
	cout << (iA << 3) << endl; // iA * 2^3
	cout << iA << endl; // iA는 그대로
    
출력 결과:
10000001
======>>=====
00100000
129
32
----
2
80
10

 

연산자 축약형


: 자신의 값을 변경하고자 할 때 줄여서 표기하는 방법

+=, -=, /=, %=, >>=, <<=

iTemp += 3; // iTemp = iTemp +3;

 

분기문


1. if문     2. switch문     3. goto문

 

[ if문 ] : 반복문

  • if ~ else 는 한묶음으로 중간에 else if를 제외한 다른 문장이 올 수 없다.
  • else if, else는 단독 사용 불가하며 가장 밑에 있는 if와 한묶음으로 사용된다.
  • 단일 코드(코드 블럭의 실행문이  한 줄인 경우) 시 중괄호 {} 생략 가능하다.
if(조건식)
{
실행코드, 몸체(코드블럭)
}
else if(조건식)
{
실행코드
}
else
{
실행코드
}

 

[ switch문 ] 

  • break; 생략 시 다음 break를 만날 때까지 명령문 실행
  • 명확한 값 (stage 1, 2, 3 )일 경우 if문보다 switch문 선호
switch문
switch(조건값) //다항식은 들어갈 수 없음
{
case 1:
	break;
case 2:
	break;
default:
	break;
}

* switch문의 case 옆에는 무조건 상수만 올 수 있다.

- 리터럴 상수 ( 3, 4 ,,, ), 심볼릭 상수 ( const iA(0); ) 

 

[ goto문 ]

  • 스파게티코드, 즉 코드가 꼬이기 때문에 사용 지양 (쓰지마)
goto Home; // Home 위치로 이동
 	- // 사이 코드블럭은 무시
Home: // Home 아래의 코드블럭 실행

L-value , R-value의 차이


Lvalue : 단일 표현식 이후에도 없어지지 않고 지속되는 객체

Rvalue :표현식이 종료된 이후에는 더 이상 존재하지 않는 임시적인 값