[모던C++입문] 1.2 변수
- 📕 Book/모던C++입문
- 2021. 6. 30.
1. C++ 기초
1.2 변수
int main()
{
int i1 = 2;
int i2, i3 = 5; //i2 는 초기화 되지 않음
float pi = 3.141592;
double x = -1.5e6; //-1500000
double y = -1.5e-6; //-0.0000015
char c1 = 'a'; c2 = 35;
bool cmp = i1 < pi, //true
happy = true;
auto i4 = i3 + 7; //i4는 int 타입
return 0;
}
내장 타입 목록 (대표적인 것들)
char, short, int, long, long long,
unsigned, signed,
float, double, long double, bool
상수
- c++에서 상수는 불변이라는 속성을 가지는 변수, 변수타입앞에 const를 붙여 지정
const int ci1 = 2;
const int ci3; //값을 할당하지 않아 빌드오류
const float pi = 3.14159;
const char cc = 'a';
const bool cmp = ci1 < pi;
리터럴
- 일반적인 정수는 자릿수에 따라 int, long, unsigned long 타입으로 취급
- 소수나 지수는 double 타입으로 취급
- 다른 리터럴 타입은 다음의 접미사를 추가한다
리터럴 타입 2 int 2u unsinged 2l long 2ul unsigned long 2.0 double 2.0f float 2.0l long double - 표준 라이브러리에는 복소수를 위한 std::complex 항목을 제공
std::complex<float> z(1.3, 2.4) z2;
z2 = 2 * z; //오류: int * complex<float> 없음
z2 = 2.0 * z; //오류: double * complex<float> 없음
z2 = 2.0f * z; //정상: float * complex<float> 있음
- 정확한 자리수를 입력하기 위해서는 리터럴을 입력해야한다
//double타입으로 처리되어 자릿수가 정확하지 않음
long double third1 = 0.3333333333333333333;
//long double 타입으로 처리되어 자릿수 정확
long double third2 = 0.3333333333333333333l;
- 10진수가 아닌수
- 0으로 시작하는 정수는 8진수로 해석
- 0x 나 0X라는 접두사를 붙이면 16진수로 해석
- c++14 에서는 0b,0B 를 통해 2진수 리터럴을 도입
- c++14 에서는 리터럴의 가독성을 위해 '(아포스트로피)로 숫자를 분리할수 있게 됨
int o1 = 042; //int o1 = 34;
int o2 = 089; //오류: 8진수에는 8,9 를 사용할 수 없다
int h1 = 0x42; //int h1 = 66;
int h2 = 0xfa; //int h2 = 250;
int b1 = 0b11111010; // int b1 = 250;
long d = 6'546'687'616'861'129l;
unsigned long ulx = 0x139'ae3b'2ab0'94f3;
int b = 0b101'1001'0011'1010'1101'1010'0001;
const long double pi = 3.141'592'653'589'793'238'462l;
축소하지않는 초기화
- c++11에서는 데이터가 손실되지 않음을 확인하는 초기화를 도입
- 중괄호 초기화(braced initialization)의 값은 축소할수 없다
- signed int 와 unsigned int 타입의 크기는 같지만 값은 다르게 표시한다
//축소하지만 컴파일 됨 (경고:'초기화 중':'double'에서 'int'로 변환하면서 데이터가 손실될 수 있습니다.)
int i1 = 3.14;
//축소 오류 (빌드오류 : 'double'에서 'int'(으)로의 변환에는 축소 변환이 필요합니다.)
int i1n = {3.14};
//축소하지만 컴파일 됨 (경고:'초기화 중': 'int'에서 'unsigned int'(으)로의 변환입니다. signed 또는 unsigned가 일치하지 않습니다.)
unsigned u2 = -3;
//축소 오류 (빌드오류 : 'int'에서 'unsigned int'(으)로의 변환에는 축소 변환이 필요합니다.)
unsigned u2n = {-3};
//괜찮을까? (경고 : '초기화 중': 'double'에서 'float'(으)로 잘립니다.)
float f1 = {3.14};
범위
- 전역 정의
- 전역 변수는 모든 함수의 바깥에 선언
- 전역 변수는 코드 어디에서나 참조 할수 있음
- 규모가 커지면 전역 변수들의 수정사항을 추적하기 어려워짐
- 전역상수가 아니면 가급적 전역 변수를 사용하지 않도록 하자
- 지역 정의
- 지역 변수는 함수 안에서 선언
- 지역 변수의 가시성/가용성은 { } 중괄호로 둘러싸인 블록으로 제한
void main()
{
{
const double pi = 3.141592;
}
//빌드오류 ('pi': 선언되지 않은 식별자입니다.)
std::cout << "pi is " << pi << ".\n";
}
숨기기
- 안쪽 범위에 잇는 변수는 바깥쪽 범위에 잇는 이름이 같은 변수를 숨긴다
void main()
{
int a = 5; //a#1을 정의
{
a = 3; //a#1을 할당
int a; //a#2를 정의, a#1은 숨겨짐 (경고: 'a' 선언은 이전 로컬 선언을 숨깁니다.)
a = 8; //a#2를 할당
{
a = 7; //a#2를 할당
}
} //a#2의 범위 종료
a = 11; //a#1에 할당 (a#2는 범위 밖)
}
반응형