-
[따배씨++] 변수, 상수, 전처리기 등 정리Study/C & C++ 2022. 9. 16. 18:35
C++ 기초를 다시 한 번 빠르게 복습할 겸 [홍정모의 따라하며 배우는 C++] 를 다시 보기로 했다.
초반 내용 정리.
01. 변수
- 변수
- 객체를 사용하기 위한 메모리의 주소값을 표현한 것... (일반적인 "변할 수 있는 수" 도 말이 된다. CS적으로 생각해보면 메모리의 주소 표현이 좀 더 맞는 말인듯)
- L-Valule와 R-Value
- 나중에 더 심도있게 글을 쓸 예정이지만, L-Value는 변수나 상수 형태로 프로그래머가 메모리에 접근할 수 있는 값, R-Value는 일반적인 방식으로 프로그래머가 접근할 수 없는 값이다. (keyword : 리터럴)
- int x = 4; x = x + 2 에서, x+2는 L-Value일까 R-Value일까?
- x+2에서 x는 컴파일러에서 4라는 값으로 대체해주고, 연산을 통해 R-Value로 생성된다. 즉, R-Value임
- 변수 초기화 방법
- 복사 초기화 : int x = 3; 과 같은 형태
- Direct Initialization : int x(3);
- Uniform Initialization : int x{3};
- 가장 엄격하게 컴파일러가 검사해준다. int x{3.14}같은 건 컴파일러 단에서 오류남
- 권장된다고 한다.
- Initialization과 Assignment는 다르다.
02. 헤더 가드
- Visual Studio에서는 헤더 파일에 #pragma once가 붙는다.
- # ~~~ 형태는 빌드 전에 처리되는 전처리기로, #pragma once는 같은 헤더 파일을 두 번 include하지 않도록 해준다.
03. namespace
- namespace는 식별자가 중복되어 충돌하지 않도록 하게 위함이다.
- 다른 namespace에 같은 이름의 변수, 상수, 함수가 정의될 수 있다.
- using namespace를 전역에 사용하는 것을 피할 것.
04. 전처리기
- 전처리 과정에서 처리되는 구문으로, 멀티 플랫폼 개발 시 자주 보게 될것 ( #define ANDROID ~~~ 이런 식이 아닐까?, #ifdef __DEBUG를 가장 많이 본듯...)
05. Fixed-Width Integer
- Integer의 Byte가 환경마다 다를 수 있을 때, 예상치 못한 오류를 방지하기 위해 씀
- int_fast_t, int_least64_t 등이 있다.
- 그냥 이런게 있다고 알아두면 좋을듯
06. 부동소수점 연산이 정확하지 않은 이유
- 지수부, 가수부로 표현되는 방식이 정확한 10진수를 표현할 수 없기 때문
- 1/2^n 으로 정확하게 표현되는 경우 아니면 오차가 쌓일 수 밖에 없음
- == 연산 피하자
- nan, inf, -inf 등이 나올 수 있다. (0으로 나누는 경우, 0/0 연산 등 하는 경우)
- nan 여부 판단 함수 std::isnan()
07. '\n'과 std::endl의 차이
- '\n'은 그냥 줄바꿈 문자이고, std::endl은 버퍼에 있는 것들을 모두 비우고 출력한 이후, 줄바꿈 하라는 의미가 담긴 객체
- std::flush는 버퍼에 있는 것들을 모두 비워 출력하고, 줄바꿈하지 않는다.
- 입출력과 버퍼에 관한 내용 공부 더 필요할듯
08. Literal Constants, Symbolic Constants
- 리터럴 상수는 R-Value로, float pi = 3.145 같은 구문에서 3.145를 말한다.
- 컴퓨터 메모리 구조에서, 3.145같은 리터럴들은 프로그램이 메모리에 로드되면서 Code영역에 위치하는 것으로 알고 있음
- 심볼릭 상수는 const int A = 123;과 같이 변수 앞에 const를 붙인 형태의 상수이다.
- 심볼릭 상수는 값을 반드시 초기화해야 한다.
- 컴파일 타임에 값이 결정되는 상수와 런타임에 값이 결정되는 상수가 있다.
- 컴파일 타임 상수임을 명시하기 위한 C++11추가 문법으로 constexpr이 있다.
- 상수들은 하나의 namespace로 묶고 헤더에 넣어서 사용하는 경우가 많음
'Study > C & C++' 카테고리의 다른 글
[C++] stringstream을 while문의 조건으로 사용할 때 주의할 점 (0) 2022.10.13 [C++] 복사 생성자와 RVO, NRVO (1) 2022.09.19 [C] 버퍼(stdin)에 대한 이해와 scanf의 문제점 (0) 2022.09.14 - 변수