오늘의 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 :표현식이 종료된 이후에는 더 이상 존재하지 않는 임시적인 값
'C++' 카테고리의 다른 글
| [TIL 5장] 3항 연산자, for문(이중 for문) (0) | 2022.08.01 |
|---|---|
| [TIL 4장] 반복문(feat. break, continue), 난수, time(), typedef (0) | 2022.07.29 |
| [TIL 2장] 표기법, 상수, 연산자 종류, 보수, sizeof(), bitset<>(), 보수 (0) | 2022.07.27 |
| [TIL 1장] 연산 단위, 자료형 종류, 10 ↔ 2 진법 변환 (0) | 2022.07.26 |
| [TIL 0장] 개발 블로그 참고 및 운영 (0) | 2022.07.23 |