본문 바로가기
Computer Science/C++

[C++] 연산자

by BrickSky 2023. 10. 27.

1) 산술 연산자

산술 연산자는 사칙연산을 다루는 기본적이면서도 가장 많이 사용되는 연산자이다.

산술 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽이다.

+ 왼쪽의 피연산자에 오른쪽의 피연산자를 더함.
- 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺌.
* 왼쪽의 피연산자에 오른쪽의 피연산자를 곱함.
/ 왼쪽의 피연산자를 오른쪽의 피연산자로 나눔.
% 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 나머지를 반환함.
int num1 = 10;
int num2 = 4;

cout << "+ 연산자에 의한 결괏값은 " << num1 + num2 << "입니다." << endl;
cout << "- 연산자에 의한 결괏값은 " << num1 - num2 << "입니다." << endl
cout << "* 연산자에 의한 결괏값은 " << num1 * num2 << "입니다." << endl;
cout << "/ 연산자에 의한 결괏값은 " << num1 / num2 << "입니다." << endl;
cout << "% 연산자에 의한 결괏값은 " << num1 % num2 << "입니다.";
+ 연산자에 의한 결괏값은 14입니다.
- 연산자에 의한 결괏값은 6입니다.
* 연산자에 의한 결괏값은 40입니다.
/ 연산자에 의한 결괏값은 2입니다.
% 연산자에 의한 결괏값은 2입니다.

 

01. 연산자의 우선순위(operator precedence)와 결합 방향(associativity)

연산자의 우선순위는 수식 내에 여러 연산자가 함께 등장할 때, 어느 연산자가 먼저 처리될 것인가를 결정한다.

 

 

2) 대입 연산자

대입 연산자는 변수에 값을 대입할 때 사용하는 이항 연산자이며, 피연산자들의 결합 방향은 오른쪽에서 왼쪽이다.

= 왼쪽의 피연산자에 오른쪽의 피연산자를 대입함.
+= 왼쪽의 피연산자에 오른쪽의 피연산자를 더한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
-= 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺀 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
*= 왼쪽의 피연산자에 오른쪽의 피연산자를 곱한 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
/= 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 결괏값을 왼쪽의 피연산자에 대입함.
%= 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 나머지를 왼쪽의 피연산자에 대입함.
int num1 = 8;
int num2 = 8;
int num3 = 8;

num1 = num1 + 5;
num2 += 5;
num3 =+ 5;

cout << "- 연산자에 의한 결괏값은 " << num1 << "입니다." << endl;
cout << "+= 연산자에 의한 결괏값은 " << num2 << "입니다." << endl;
cout << "=+ 연산자에 의한 결괏값은 " << num3 << "입니다.";
-  연산자에 의한 결괏값은 13입니다.
+= 연산자에 의한 결괏값은 13입니다.
=+ 연산자에 의한 결괏값은 5입니다.

위의 예제에서 num =+ 5 연산은 단순히 숫자 5를 변수 num3에 대입하는 연산이다.

복합 대입 연산자에서 연산자의 순서는 매우 중요하므로 주의를 기울여야 한다.

 

 

3) 증감 연산자

증감 연산자는 피연산자를 1씩 증가 혹은 감소시킬 때 사용하는 연산자이다.

이 연산자는 피연산자가 단 하나뿐인 단항 연산자이다.

++x 먼저 피연산자의 값을 1 증가시킨 후에 해당 연산을 진행함.
x++ 먼저 해당 연산을 수행하고 나서, 피연산자의 값을 1 증가시킴.
--x 먼저 피연산자의 값을 1 감소시킨 후에 해당 연산을 진행함.
x-- 먼저 해당 연산을 수행하고 나서, 피연산자의 값을 1 감소시킴.
int num1 = 8;
int num2 = 8;
int result1, result2;

result1 = --num1 + 5;
result2 = num2-- + 5;

cout << "전위 감소 연산자에 의한 결괏값은 " << result1 << "이고,변수의 값은 " << num1 << "로 변했습니다.";
cout << "후위 감소 연산자에 의한 결괏값은 " << result2 << "이고, 변수의 값은 " << num2 << "로 변했습니다.";
전위 감소 연산자에 의한 결괏값은 12이고, 변수의 값은 7로 변했습니다.
후위 감소 연산자에 의한 결괏값은 13이고, 변수의 값은 7로 변했습니다.

위의 예제에서 첫 번째 연산은 변수 num1의 값을 먼저 1 감소시킨 후에 나머지 연산을 수행한다.

하지만 두 번째 연산에서는 먼저 모든 연산을 마친 후에 변수 num2의 값을 1 감소시킨다.

따라서 변수 num2의 감소 연산자는 전체 연산에 어떠한 영향도 미치지 않는 것을 알 수 있다.

 

01. 증감 연산자의 연산 순서

int x = 10;
int y = x-- + 5 + --x;
 
cout << "변수 x의 값은 " << x<< "이고, 변수 y의 값은 " << y << "로 변했습니다.";

① : 첫 번째 감소 연산자(decrement operator)는 피연산자의

      뒤쪽에 위치하므로, 덧셈 연산이 먼저 수행된다.

② : 덧셈 연산이 수행된 후에 감소 연산이 수행된다. (x의 값 : 9)

③ : 두 번째 감소 연산자는 피연산자의 앞쪽에 위치하므로,

       덧셈 연산보다 먼저 수행된다. (x의 값 : 8)

④ : 감소 연산이 수행된 후에 덧셈 연산이 수행됩니다.

⑤ : 마지막으로 변수 y에 결괏값의 대입 연산이 수행된다.

      (y의 값 : 23)

 

 

 

 

4) 비교 연산자

비교 연산자는 피연산자 사이의 상대적인 크기를 판단하는 연산자이다. 비교 연산자는 왼쪽의 피연산자와 오른쪽의 피연산자를 비교하여, 어느 쪽이 더 큰지, 작은지, 또는 서로 같은지를 판단한다.

== 왼쪽의 피연산자와 오른쪽의 피연산자가 같으면 1을 반환함.
!= 왼쪽의 피연산자와 오른쪽의 피연산자가 같지 않으면 1을 반환함.
> 왼쪽의 피연산자가 오른쪽의 피연산자보다 크면 1을 반환함.
>= 왼쪽의 피연산자가 오른쪽의 피연산자보다 크거나 같으면 1을 반환함.
< 왼쪽의 피연산자가 오른쪽의 피연산자보다 작으면 1을 반환함.
<= 왼쪽의 피연산자가 오른쪽의 피연산자보다 작거나 같으면 1을 반환함.

💡 C++에서 거짓(false)은 0이며, 0이 아닌 모든 것은 참(true)으로 인식된다.

int num1 = 3;
int num2 = 7;

cout << "!= 연산자에 의한 결괏값은 " << (num1 != num2) << "입니다." << endl;
cout << ">= 연산자에 의한 결괏값은 " << (num1 >= num2) << "입니다.";
!= 연산자에 의한 결괏값은 1입니다.

>= 연산자에 의한 결괏값은 0입니다.

 

 

5) 논리 연산자

논리 연산자는 주어진 논리식을 판단하여, 참(true)과 거짓(false)을 결정하는 연산자이다.

AND 연산과 OR 연산은 두 개의 피연산자를 가지는 이항 연산자이며, NOT 연산자는 피연산자가 단 하나뿐인 단항 연산자이다.

논리 연산자 설명
&& 논리식이 모두 참이면 1을 반환함. (논리 AND 연산)
|| 논리식 중에서 하나라도 참이면 1을 반환함. (논리 OR 연산)
! 논리식의 결과가 참이면 0을, 거짓이면 1을 반환함. (논리 NOT 연산)

 

int num1 = 3;
int num2 = -7;
bool result1, result2;

result1 = (num1 > 0) && (num1 < 5);
result2 = (num2 < 0) || (num2 > 10);

cout << "&& 연산자에 의한 결괏값은 " << result1 << "입니다." << endl;
cout << "|| 연산자에 의한 결괏값은 " << result2 << "입니다." << endl;
cout << " ! 연산자에 의한 결괏값은 " << !result2 << "입니다." << endl;
&& 연산자에 의한 결괏값은 1입니다.
|| 연산자에 의한 결괏값은 1입니다.
 ! 연산자에 의한 결괏값은 0입니다.

 

 

6) 비트 연산자

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

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

비트 연산자 설명
& 대응되는 비트가 모두 1이면 1을 반환함. (비트 AND 연산)
| 대응되는 비트 중에서 하나라도 1이면 1을 반환함. (비트 OR 연산)
^ 대응되는 비트가 서로 다르면 1을 반환함. (비트 XOR 연산)
~ 비트를 1이면 0으로, 0이면 1로 반전시킴. (비트 NOT 연산, 1의 보수)
<< 지정한 수만큼 비트들을 전부 왼쪽으로 이동시킴. (left shift 연산)
>> 부호를 유지하면서 지정한 수만큼 비트를 전부 오른쪽으로 이동시킴. (right shift 연산)

 

다음 그림은 비트 AND 연산자(&)의 동작을 나타낸다. 비트 AND 연산자는 대응되는 두 비트가 모두 1일 때만 1을 반환하며, 다른 경우는 모두 0을 반환한다

 

 

 

 

 

 

 

 

.

다음 그림은 비트 OR 연산자(|)의 동작을 나타낸다.

이처럼 비트 OR 연산자는 대응되는 두 비트 중 하나라도 1이면 1을 반환하며, 두 비트가 모두 0일 때만 0을 반환한다.

 

 

 

 

 

 

 

다음 그림은 비트 XOR 연산자(^)의 동작을 나타낸다.

이처럼 비트 XOR 연산자는 대응되는 두 비트가 서로 다르면 1을 반환하고, 서로 같으면 0을 반환한다.

 

 

 

 

 

 

 

 

 

다음 그림은 비트 NOT 연산자(~)의 동작을 나타낸다.

이처럼 비트 NOT 연산자는 해당 비트가 1이면 0을 반환하고, 0이면 1을 반환한다.

 

 

 

 

 

 

int num1 = 15;
int num2 = 8

cout << "~ 연산자에 의한 결괏값은 " << (~num1) << "입니다." << endl;
cout << "<< 연산자에 의한 결괏값은 " << (num2 << 2) << "입니다." << endl;
cout << ">> 연산자에 의한 결괏값은 " << (num2 >> 2) << "입니다.";
~  연산자에 의한 결괏값은 -16입니다.
<< 연산자에 의한 결괏값은 32입니다.
>> 연산자에 의한 결괏값은 2입니다.

왼쪽 시프트 연산자(<<)는 지정한 수만큼 피연산자의 모든 비트를 전부 왼쪽으로 이동시켜 준다.

또한, 두 번째 연산의 오른쪽 시프트 연산자(>>)는 지정한 수만큼 피연산자의 모든 비트를 전부 오른쪽으로 이동시켜 준다. 결과를 살펴보면 한 비트씩 오른쪽으로 이동할 때마다 2배씩 감소한다는 사실을 알 수 있다.

 

 

7) 기타 연산자

01. 삼항 연산자

삼항 연산자는 다른 언어에는 존재하지 않는 C언어와 C++ 만의 독특한 연산자이다.

이 연산자는 C++에서 유일하게 피연산자를 세 개나 가지는 조건 연산자이다.

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

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

int num1 = 11;
int num2 = 10;
int result;

result = (num1 < num2) ? num1 : num2;

cout << "둘 중에 더 작은수는 " << result << "입니다.";
둘 중에 더 작은수는 10입니다.

 

02. 쉼표 연산자

쉼표(,) 연산자는 얼핏 연산자가 아닌 것처럼 보이지만 다양한 용도로 사용되는 연산자이다.

이 연산자는 어떠한 연산을 수행하는 것이 아닌 다음과 같은 상황에서 사용된다.

  • 두 연산식을 하나의 연산식으로 나타내고자 할 때
  • 둘 이상의 인수를 함수로 전달하고자 할 때
int num1 = 15, num2 = 8;
cout << "첫 번째 수는 " << num1 << "이고, 두 번째 수는 " << num2 << "입니다.";
첫 번째 수는 15이고, 두 번째 수는 8입니다.

 

03. size of 연산자

사용자의 컴퓨터 환경에 따라 타입에 할당되는 메모리의 크기가 달라질 수 있다.

sizeof 연산자는 단항 연산자로 피연산자의 크기를 바이트 단위로 반환하며 sizeof 연산자에 변수나 상수가 피연산자로

전달되면, 해당 변수나 상숫값에 해당하는 타입의 크기를 반환한다.

cout << " char형 데이터에 할당되는 메모리의 크기는 " << sizeof(char) << " 바이트입니다." << endl;
cout << " short형 데이터에 할당되는 메모리의 크기는 " << sizeof(short) << " 바이트입니다." << endl;
cout << " int형 데이터에 할당되는 메모리의 크기는 " << sizeof(int) << " 바이트입니다." << endl;
cout << " long형 데이터에 할당되는 메모리의 크기는 " << sizeof(long) << " 바이트입니다." << endl;
cout << " long long형 데이터에 할당되는 메모리의 크기는 " << sizeof(long long) << " 바이트입니다." << endl;
cout << " float형 데이터에 할당되는 메모리의 크기는 " << sizeof(float) << " 바이트입니다." << endl;
cout << " double형 데이터에 할당되는 메모리의 크기는 " << sizeof(double) << " 바이트입니다." << endl;
cout << "long double형 데이터에 할당되는 메모리의 크기는 " << sizeof(long double) << " 바이트입니다.";
char형 데이터에 할당되는 메모리의 크기는  1 바이트입니다.
short형 데이터에 할당되는 메모리의 크기는  2 바이트입니다.
int형 데이터에 할당되는 메모리의 크기는  4 바이트입니다.
long형 데이터에 할당되는 메모리의 크기는  8 바이트입니다.
long long형 데이터에 할당되는 메모리의 크기는  8 바이트입니다.
float형 데이터에 할당되는 메모리의 크기는  4 바이트입니다.
double형 데이터에 할당되는 메모리의 크기는  8 바이트입니다.
long double형 데이터에 할당되는 메모리의 크기는 16 바이트입니다.

 

 

8) C++ 연산자

01. 범위 지정 연산자

C++에서 가장 우선순위가 높은 연산자는 바로 범위 지정 연산자이다.

범위 지정 연산자(::)는 여러 범위에서 사용된 식별자(identifier)를 식별하고 구분하는 데 사용하는 연산자이며,

이러한 식별자로는 변수, 함수 또는 열거체가 올 수 있다. 범위 지정 연산자를 변수의 이름 앞에 붙이면 해당 변수는 전역으로 사용하라는 의미로 쓰인다.

또한, 클래스에 이 연산자를 사용하면 네임스페이스 멤버를 식별하거나, 클래스의 정적 멤버를 호출할 수 있다.

C++에서 범위 지정 연산자를 사용하기 위한 문법은 다음과 같다.

1. ::식별자
2. 클래스이름::식별자
3. 네임스페이스::식별자
4. 열거체::식별자

 

02. 멤버 포인터 연산자

C++에서는 멤버 포인터 연산자를 사용하여 클래스의 멤버를 가리키는 포인터를 정의할 수 있다.

이러한 멤버 포인터 연산자는 다음과 같이 두 가지 형태가 있다.

  1. 왼쪽의 피연산자가 클래스 타입의 객체인 경우 : .*
  2. 왼쪽의 피연산자가 클래스 타입의 객체를 가리키는 포인터인 경우 : ->*

C++에서 멤버 포인터 연산자를 사용하기 위한 문법은 다음과 같다.

1. 클래스타입의객체.*멤버이름
2. 클래스타입객체의포인터->*멤버이름

'Computer Science > C++' 카테고리의 다른 글

[C++] 배열과 포인터(1차원 배열,다차원 배열)  (0) 2023.11.05
[C++] 제어문  (0) 2023.10.28
[C++] 타입 (기본 타입,타입 변환)  (0) 2023.10.26
[C++] 타입 (변수,상수)  (1) 2023.10.25
[C++] C++ 시작  (1) 2023.10.25