C++의 연산자와 표현식

1. 표현식

 

프로그램은 많은 식과 조건이 조합되어 특정 작업을 수행하는 명령의 모음

 

프로그래밍에서 계산할 때 사용하는 식을 표현식(expression)

 

계산을 수행하는 것이 목적이므로, 항상 결과를 가진다

 

따라서 대부분의 표현식은 여러개의 피연산자와 연산자로 구성

 

연산자는 연산의 종류를 결정하고 피연산자는 연산에 참여하는 값 또는 식별자이다

 

표현식: 1 + 2 

 

1,2는 피연산자

 

+는 연산자

 

 

2. 상수 표현식

 

상수로만 이뤄진 단순한 표현식

 

상수는 1, 12.345, 'A'같이 변하지 않는 값

 

 

3. 단항 연산자 표현식

 

연산자와 피연산자가 일대일로 매칭되는 표현식

 

연산에 참여하는 피연산자가 하나인 표현식이다

 

형변환, 부호변경, 증감 연산자 등이 모두 포함

 

부호 연산자: +a, -a

 

증감 연산자: ++a, --a, a++, a--

 

형식 변환: (type)a

 

크기: sizeof(a)

 

논리 not: !a

 

비트 연산자: ~a

 

포인터 연산자: *a

 

주소 연산자: &a

 

 

4. 증감 연산자

 

증가 연산자인 ++는 피연산자를 1만큼 증가

 

감소 연산자인 --는 피연산자를 1만큼 감소

 

변수 앞에 붙는 전위 연산 ++a와 뒤에 붙는 후위 연산 a++는 순서에 차이가 있다

 

#include <iostream>
using namespace std;

int main(){

	int a = 0; //최초 a 값 0
	int b = 0; //최초 b 값 0

	int a_prefix;
	int b_postfix;

	a_prefix = ++a; //a값을 1 증가시키고 a_prefix에 대입
	b_postfix = b++; //b값을 b_postfix에 대입하고 b를 1 증가

	cout << "a = " << a << ", " << "a_prefix = " << a_prefix << endl;
	cout << "b = " << b << ", " << "b_postfix = " << b_postfix << endl;

	return 0;
}

 

etc-image-0

 

 

 

결과를 보면 같은 증가 연산인데도 전위인지 후위인지에 따라 결과가 다르다

 

a 변수 앞에 붙은 전위 연산자는 a 변수가 다른 연산에 이용되기 전에 먼저 증가가 수행

 

그래서 a 값이 처음 0에서 1이 되고 이후 a_prefix에 변수 a가 대입

 

결국 a와 a_prefix는 같은 값이 출력

 

반면 후위 연산자는 전위 연산자와 반대로 b_postfix에 b값인 0을 대입하는 연산이 먼저 수행된다

 

이후 b가 증가해 1이 출력

 

그래서 b와 b_postfix는 다른 값이 출력

 

 

5. 논리 NOT

 

값이나 식별자 앞에 !를 붙여서 true는 false로 false는 true로 반전

 

C나 C++에서 0은 false로 0 외에는 모두 true로 취급함

 

 

6. 비트 연산자

 

비트 연산자 ~는 비트열을 반전하라는 뜻으로 각 자릿수의 비트값을 반대로 바꿔 1의 보수로 변환함

 

0과 1로 이루어진 2진수는 0 > 1, 1 > 0으로 바뀐다

 

16진수 0은 모두 f로 바뀐다

 

#include <iostream>
using namespace std;

int main(){

	unsigned int value = 0x00000000; //0을 16진수(hex)로 표현한 값

	value = ~value;
	cout << hex << value << endl;

	return 0;
}

 

 

 

etc-image-1

 

 

 

7. 2의 보수

 

1의 보수에 1을 더하면 2의 보수를 구할 수 있다

 

양수의 모든 비트를 반전한 1의 보수에 1을 더해 음수를 표현하는 방법에 사용

 

가장 첫번째 비트는 부호 비트로 활용

 

10진수 2진수 1의 보수 2의 보수(음수) 10진수(음수)
0 0000 0000 1111 1111 0000 0000 0
1 0000 0001 1111 1110 1111 1111 -1
2 0000 0010 1111 1101 1111 1110 -2
3 0000 0011 1111 1100 1111 1101 -3
4 0000 0100 1111 1011 1111 1100 -4
5 0000 0101 1111 1010 1111 1011 -5

 

 

1의 보수에 1을 더한게 2의 보수라면서 왜 1111 1111에 1을 더하면 0000 0000이냐?

 

비트 크기를 고정해야해서 그런다네

728x90

'프로그래밍 > C++' 카테고리의 다른 글

키워드와 리터럴  (0) 2025.02.15
C++의 변수 형식 변환  (0) 2025.02.12
L-value와 R-value??  (0) 2025.02.12
C++ 변수 유효 범위  (0) 2025.01.23
C++에서 사용하는 데이터 형식  (0) 2024.12.30