C++

C++ 기초(변수와 연산자)

hellowhales 2023. 1. 19. 18:45
728x90

 

변수는 수학에서와 같이 어떤 임의값을 담을 수 있는 역할을 한다. 각 블록 안에서 변수는 선언한 줄 다음부터 어디에서나 접근될 수 있다. 변수는 선언되면서 초기화될 수 있고 초기화되지 않을 수도 있다. 초기화되지 않을 시에 선언할 시 점의 메모리 값을 기반으로 무작위 값이 대입될 수 있는데, 이로 인해 버그가 발생할 수 있다.

int uninitializedInt; // 초기화하지 않고 선언
int initializedInt = 7 // 선언과 동시에 초기화
 

다음은 자주 사용되는 변수 타입들이다.

타입
설명
(signed) int
signed
부호가 있는 정수
값의 범위는 컴파일러마다 다르나 대부분 4바이트
int i = 1;
signed int i = -8;
signed i = 5;
(signed) short (int)
작은 범위의 정수(대부분 2바이트)
short s =13;
(signed) long (int)
큰 범위의 정수 (대부분 4바이트)
long l =-7L;
(signed) long long (int)
아주 큰범위의 정수
범위는 컴파일러마다 다르나 최소한 long보다 크다(주로 8바이트)
long long ll = 14LL;
unsigned (int)
unsigned short (int)
unsigned long (int)
unsigned long long (int)
위의 각 정수 타입의 범위를 >=0으로 제한(음이 아닌 정수)
unsigned int i =2U;
unsigned short s= 23U;
unsigned long l = 5400UL;
unsigned long long ll = 14ULL;
float
단정도 부동소수점수
float f = 7.2f;
double
배정도 부동소수점수. 정밀도가 최소한 float보다 크다
double d= 7.2;
long double
롱배정도 부종소수점수.
정밀도가 최소한 double보다 크다
long double d= 16.98L;
char
단일 문자
char ch = 'm';
char16_t
16비트 단일 문자
char16_t c16 = u'm';
char32_t
32비트 단일 문자
char32_t c32 = U'm';
wchar_t
단일 확장 문자
wchar_t w = L'm';
bool
부울 타입 true나 false 중 하나의 값을 가진다.
bool b = true;
std::byte
한 바이트를 표현한다.
std::byte b{42};

 

연산자는 보통 변수값을 변경하기 위해 사용되고 단항, 이항, 삼항 연산자로 분류할 수 있다.

연산자
설명
=
오른쪽 값을 왼쪽에 대입하는 이항 연산자
int i = 3;
!
표현식의 참/거짓을 반전시키는 단항 연산자
bool b = !true;// b = false
+, -, *, /
사칙연산을 해주는 이항 연산자
int i = 3 + 7;
int j = 6 - 1;
int k = i * j;
int w = i / j;
%
나눗셈의 나머지를 계산하는 이항 연산자(모듈로)
int remainder = 5 %2; // 1
++
표현식에 1을 더하는 단항 연산자. 표현식의 앞에 나오냐 뒤에 나오냐에 따라 사전 증가와 사후 증가가 된다.
사전 증가면 표현식 결과에 1이 증가된 값이 반영되고
사후 증가면 표현식 결과에 현재값이 반영된 뒤 1을 증가 시킨다.
i++;
++i
--
위와 마찬가지로 표현식에 1을 빼주는 단항 연산자.
마찬가지로 사전 감소와 사후 감소로 나뉜다.
i--;
--i;
+=
-=
*=
/=
%=
각 문장의 축약형
i = i + j;
i = i - j;
i = i * j;
i = i / j;
i = i % j;
i +=j;
i -= j;
i *= j;
i /= j;
i %= j;
&
&=
양쪽에 나온 표현식끼리 비트 단위 AND 연산 수행
i = j & k;
i &= j;
|(shift + \키)
|=
양쪽에 나온 표현식끼리 비트 단위 OR 연산 수행
i = j | k;
j |= k;
<<
>>
<<=
>>=
왼쪽에 나온 표현식의 비트값을 오른쪽에 나온 수만큼 왼쪽(<<) 또는 오른쪽(>>) 으로 시프트(이동)한다.
i = i <<1;
i = i >>4;
i <<=1;
i >>=4;
^
^=
양쪽 표현식에 비트 단위 XOR 연산 수행
i =i ^ j;
i ^= j;

 

여러 연산자가 복잡하게 뒤엉켜있는 코드의 경우 컴파일러는 정해진 순서에 따라 연산을 수행한다.

/, *, % >>>>> +, - >>>>> 비트 단위 연산 순으로 연산을 수행하며 우선 순위가 같을 시에는 왼쪽에서 오른쪽으로 연산을 수행한다. 평가 순서를 명확히 정해주기 위해서는 소괄호를 이용하면 된다.

 

C++는 논리 연산자가 들어가는 논리 표현식을 단락 논리short-circuit logic(축약 논리) 방식으로 평가한다. 이는 표현식을 평가하는 도중에 최종 결과가 확정되면 나머지 부분은 평가하지 않는다.

bool result = bool1 || bool2 || (i > 7) || (27 / 13 % i + 1) <2;
 

예를 들어 위와 같은 식이 있을 때 만약 bool1이 true라는 결과가 나오면 전체가 true일 수 밖에 없으므로 나머지 부분을 평가하지 않는다. 이는 만약 표현식의 끝에서 버그가 발생한다면 버그를 찾기 어렵게 만들 수 있다. 하지만 반대로 가볍게 검사할 수 있는 부분을 앞에 두고 시간이 오래걸리는 부분을 뒤로 두는 방법으로 성능을 향상시킬 수 있다.

 

728x90