2024_02_20 [C++] 연산자

2024. 2. 20. 23:59C++

C++을 포함하여 여러 언어들의 코드를 작성하다보면 우리는 여러가지 연산자를 마주하게 된다.

이때 우리는 보고 있는 연산자가 무엇인지, 어떠한 작업을 수행하는지 알아볼 수 있어야 한다.

 

자, 지금부터 연산자에 대하여 알아보도록 하자.

 

1. 대입 연산자

데이터를 저장하는 연산자이다.

쉽게 풀어 이야기하면, 우리가 변수에 값을 대입할 때 사용하는 연산자이다.

int alpha = 5;

위의 코드를 보면 alpha라는 변수에 5가 대입된 것을 볼 수 있는데, 여기서 나오는 '='문자가 여기에 속한다.

 

2. 산술 연산자

사칙연산을 다루는 가장 기본적이며 많이 다루는 연산자이다.

산술 연산자 설명
+ 왼쪽의 피연산자에 오른쪽 피연산자를 더한다.
- 왼쪽의 피연산자에 오른쪽 피연산자를 뺀다.
* 왼쪽의 피연산자에 오른쪽 피연산자를 곱한다.
/ 왼쪽의 피연산자에 오른쪽 피연산자를 나눈다.
% 왼쪽의 피연산자에 오른쪽 피연산자를 나누고 그 나머지를 반환한다.

 

3. 관계 연산자

비교 연산자라고 불리기도 하며 주어진 조건의 참, 거짓을 판별하는 연산자이다.

결과는 반드시 True와 Flase로 나뉘며 True는 1, False는 0으로 나타낼 수 있다.

관계 연산자 설명
> 왼쪽의 피연산자가 오른쪽 피연산자보다 큰가?
< 왼쪽의 피연산자가 오른쪽 피연산자보다 작은가?
>= 왼쪽의 피연산자가 오른쪽 피연산자보다 크거나 같은가?
<= 왼쪽의 피연산자가 오른쪽 피연산자보다 작거나 같은가?
== 왼쪽의 피연산자가 오른쪽 피연산자와 같은가?
!= 왼쪽의 피연산자가 오른쪽 피연산자와 다른가?

 

4. 증감 연산자

피연산자의 값을 1증가 또는 1감소시킬 때 사용하는 연산자이다.

때문에 해당 연산자는 다른 연산자와 달리 사용되는 피연산자가 1개뿐인 단항 연산자이다.

증감 연산자 설명
++a 피연산자의 값을 1증가 후, 연산을 진행
a++ 연산을 먼저 진행한 후, 피연산자의 값을 1증가
--a 피연산자의 값을 1감소 후, 연산을 진행
a-- 연산을 먼저 진행한 후, 피연산자의 값을 1감소

(변수가 연산자의 앞, 뒤에 있는지에 따라 전위 방식, 후위 방식으로 구별할 수 있다.)

전위 방식(++a,--a) : 연산자가 변수보다 앞에 위치한다. -> 선 증가(감소) 후 연산 처리

후위 방식(a++,a--) : 변수가 연산자보다 앞에 위치한다. -> 선 연산 처리 후 증가(감소)

 

5. 복합 대입 연산자

연산을 처리한 값을 피연산자에 대입하여 저장하는 연산자이다.

'=' 연산자를 제외한 대입 연산자들은 모두 복합 대입 연산자라고 생각하면 편하다.

대입 연산자 설명
+= 왼쪽의 피연산자에 오른쪽 피연산자를 더하고, 그 결과값을 왼쪽의 피연산자에 대입
-= 왼쪽의 피연산자에 오른쪽 피연산자를 빼고, 그 결과값을 왼쪽의 피연산자에 대입
*= 왼쪽의 피연산자에 오른쪽 피연산자를 곱하고, 그 결과값을 왼쪽의 피연산자에 대입
/= 왼쪽의 피연산자에 오른쪽 피연산자를 나누고, 그 결과값을 왼쪽의 피연산자에 대입
%= 왼쪽의 피연산자에 오른쪽 피연산자를 더하고, 그 나머지 값을 왼쪽의 피연산자에 대입

 

6. 논리 연산자

주로 조건문(if)에서 사용되며 주어진 논리식을 판별하여 참, 거짓을 결정하는 연산자이다.

논리 연산자 명칭 설명
&& AND 연산 피연산자가 모두 참(True)일때만 참을 반환
|| OR 연산 피연산자들 중 하나라도 참이 있으면 참을 반환
! 부정 연산 피연산자가 참이면 거짓, 거짓이면 참을 반환

 

7. 비트 연산자

논리 연산자와 비슷하지만, bit 단위로 논리 연산을 할 때 사용되는 연산자이다.

비트 단위로 왼쪽이나 오른쪽으로 전체 비트를 이동시키거나 1의 보수를 만들 때도 사용된다.

비트 연산자 명칭 설명
& 비트 AND 연산 대응되는 2개의 비트가 모두 1일때 1을 반환
| 비트 OR 연산 대응되는 2개의 비트 중 하나라도 1이면 1을 반환
^ 비트 XOR 연산 대응되는 비트가 서로 다르면 1을 반환
~ 비트 NOT 연산,
1의 보수
비트가 1이면 0, 0이면 1로 반환
<< left shift 연산 지정한 수만큼 비트들을 왼쪽으로 이동
>> right shift 연산 지정한 수만큼 비트들을 오른쪽으로 이동

 

시프트 연산이 생각보다 복잡함으로 추가적인 설명이 필요하다고 생각한다.

int sNum = 15;	 
int sRes = sNum << 1;
int sRes1 = sNum << 2; 
int sRes2 = sRes1 >> 1;

위의 내용을 예문으로 들어보자.

 

sNum의 값이 15임으로 비트 단위로 바꾸면 그 값은 0000 1111로 나타낼 수 있다.

 

여기서 sRes는 sNum을 오른쪽에서 왼쪽으로 1만큼 움직인 값을 대입하라는 코드가 등장한다.

자, 이제 sNum의 값을 1만큼 이동시켜보자

0000 1111   --왼쪽으로 1만큼 이동-->    0001 1110

그럼 sRes에 대입된 수는 0001 1110의 숫자인 30이라는 것을 알 수 있다.

(16+8+4+2 = 30) 

 

sRes1은 sNum을 2만큼 움직이라고 나와있는데, 방식은 위와 동일하여 생략하도록 하겠다.

그러면 결과의 값은 60이 나온다.

 

이를 통하여 우리는 오른쪽에서 왼쪽으로 시프트 이동을 하면 값이 2배로 증가하는 것을 알 수 있다.

 

그럼 반대로 왼쪽에서 오른쪽으로 이동한 것은 어떨까?

sRes2는 sRes1을 왼쪽에서 오른쪽으로 1만큼 이동한 값을 대입받는다.

0011 1100 --오른쪽으로 1만큼 이동--> 0001 1110

결과를 통해 우리는 sRes2가 sRes와 동일하다는 것을 알 수 있다.

 

왼쪽에서 오른쪽으로 이동을 하면 값이 0.5배로 나뉜다.

 

이것으로 우리는 시프트 이동의 방향에 따라 결과 값을 2배로 곱하거나 나뉘어 질 수 있는 것을 파악해야한다.

 

8. 삼항 연산자

삼항 연산자는 C언어와 C++만의 독특한 연산자이다.

특히 해당 연산자는 유일하게 피연산자를 3개나 가지는 조건 연산자인데,

(연산자가 3개가 들어가서 삼항 연산자라고 불린다.)

해당 연산자를 이용하면 간단한 if문을 단 한줄로 간단하게 표기할 수 있다.

 

문법
 조건식 ? 반환값1 : 반환값2

물음표(?) 앞의 조건식에 따라 결과값이 참이면 반환값1을 반환하고 거짓이면 반환값2를 반환한다.

 

int num1 = 5;
int num2 = 7;
int res;

if (num1>num2)
{
	res=num1;
}
else
{
	res=num2;
}

앞서 이야기한 것처럼 삼항 연산자는 if문을 대체할 수 있는데, 예시로 위의 지문을 삼항 연산자로 바꿔보자

 

여기서 if문의 내용을 살펴보면

"num1이 num2보다 크다."라는 조건문을 가지고 있고 해당 "내용이 참일때 res에 num1의 값을 대입",

"거짓일때는 res에 num2의 값을 대입한다"라는 의미를 가졌다는 것을 알 수 있다.

 

이를 삼항 연산자로 변환하면

int num1=5;
int num2=7;
int res;

res= (num1>num2) ? num1 : num2;

8줄인 if문이 단 1줄로 줄어든 것을 볼 수 있다.

'C++' 카테고리의 다른 글

[C++] 포인터 변수  (1) 2024.02.28
2024_02_22 [C++] 반복문  (0) 2024.02.22
2024_02_21 [C++] 조건문 / 분기문  (0) 2024.02.21
2024_02_20 [C++] 이름  (0) 2024.02.20
2024_02_19 C++ 입문?  (0) 2024.02.19