본문 바로가기
C++/이론

[C++] 연산자

by 씐 2023. 9. 7.
728x90

연산자(operator)

 

연산자

  • 변수와 상수 등의 데이터를 대상인 피연산자(operand)에 대해 연산 동작을 행하는 기호
  • C++에서 사용할 수 있는 연산자에는 산술, 관계, 논리, 증감, 대입, 비트, sizeof, 캐스트 연산자 등이 있다.

산술 연산자(arithmetic operator)

 

산술 연산자

  • 산술 연산자는 피연산자에 대한 덧셈, 뺄셈, 곱셈, 나눗셈을 하는 연산자다.
  • 산술 연산자의 주의 사항
    • 피연산자의 자료형에 의해서 결과값이 달라질 수 있다.
    • 이항 연산자 중 나머지를 구하는 %는 정수형 데이터만 피연산자로 취할 수 있다.
  • 산술 연산자의 종류
구분
연산자
표현
의미
단항 연산자
+
+3
양수
-
-2
음수
이항 연산자
+
3 + 2
덧셈
-
3 - 2
뺄셈
*
3 * 2
곱셉
/
3 / 2
나눗셈
%
3 % 2
나머지

 

산술 연산자의 우선순위

  1. 괄호 안에 있는 연산자가 가장 먼저 계산된다. 괄호 여러 개가 중첩되어 있을 경우 가장 안쪽의 괄호가 먼저 계산된다.
  2. *(곱셈), /(몫을 구하는 나눗셈), %(나머지를 구하는 나눗셈) 연산자가 다음으로 계산된다. *, /, % 등 연산자가 여러 개 있을 경우 왼쪽에서 오른쪽으로 연산이 실행된다. 이 3가지 연산자 사이의 우선순위는 같다.
  3. +(덧셈), -(뺄셈) 연산자가 그 다음으로 계산된다. 수식 안에 +, - 연산자가 여러 개 있을 경우 왼쪽에서 오른쪽으로 연산이 실행된다. 이 2가지 연산자 사이의 우선순위는 같다.
 

관계 연산자(relational operator)

 

관계연산자
  • 관계 연산자는 숫자 2개를 비교하는 연산자로 연산의 결과는 항상 참(true, 1) 또는 거짓(false, 0)이 된다.
  • 주로 for문이나 while문 등의 제어문에서 조건을 검사하는 식에 많이 사용한다.
  • 관계 연산자는 두 수가 서로 같은지, 다른지를 비교하는 항등 연산자(equality operator) 2개와 크기를 비교하는 비교 연산자 4개로 구분
  • 관계 연산자의 종류
구분
연산자
의미
항등 연산자
==
좌측이 우측과 같다.
!=
좌측이 우측과 같지 않다.
비교 연산자
>
좌측이 우측보다 크다.
>=
좌측이 우측보다 크거나 같다.
<
좌측이 우측보다 작다.
<=
좌측이 우측보다 작거나 같다.

논리 연산자(logical operator)

 

논리연산자
  • 일련의 조건을 모두 만족하는 경우나 일부만 막족하는 경우를 구별하는데 사용한다.
  • 피연산자의 논리값은 참(true) 또는 거짓(false)이어야 한다.
  • 논리 연산자의 종류
종류
설명
&&
논리곱 연산자(AND)
||
논리합 연산자(OR)
!
단항 논리부정 연산자(NOT)

 

AND, OR, NOT

#include <iostream>
using namespace
void main()
{
  int num = 85;
  bool istrue;
  
  istrue = ! num == 70;
  cout << "! num == 70 = " << istrue <<"\n";
  //결과 : ! num == 70 = 0(false)
  //논리부정 연산자 !가 먼저 수행되고 그 다음 관계 연산자인 ==가 수행된다.
  //!num -> false, 0 == 70을 물어보는 것이 됨. 따라서 ! num == 70 = 0(false)
  
  istrue = !(num == 70);
  cout << "!(num == 70) = " << istrue << "\n";
  //결과 : !(num == 70) = 1(true)
  //괄호가 있으므로 ==가 먼저 수행된다. 
  //num == 70 -> false, !(false) = true의 관계가 됨. 따라서 !(num == 70) = 1(true)
}
  • AND : 피연산자가 모두 true이면 결과는 true, 하나라도 false이면 결과는 false
  • OR : 피연산자 중에서 하나 이상만 true이면 결과는 true
  • NOT : 피연산자 하나를 부정하는 논리부정
  •  논리 연산자의 우선 순위
    • 논리 부정(!) > 논리 곱(&&) > 논리 합(||)
    • 논리 연산자와 관계 연산자가 함께 사용되면 관계 연산자의 우선 순위가 높으므로 관계 연산한 결과를 가지고 논리 연산을 하게 된다.
    • 하지만 NOT 연산자는 관계 연산자보다 우선순위가 높아 먼저 수행된다.
  • 논리 연산자 &&와 ||의 진리표
&&(AND)
||(OR)
0
0
0
0
0
1
0
1
1
0
0
1
1
1
1
1
  • 논리 연산자 !의 진리표
!
0
1
1
0

 


증감 연산자

 

증감 연산자

  • 변숫값을 1만큼 증가시키거나 1만큼 감소시켜야 하는 경우에 사용하는 연산자 
  • 증감 연산자는 전위 연산자(prefix operator)와 후위 연산자(postfix operator)가 있다.
    • 전위 연산자 : 변수의 앞에 연산자를 붙인다. 연산 전에 변숫값을 1씩 증감시킨다.
    • 후위 연산자 : 변수의 뒤에 연산자를 붙인다. 연산 후에 변숫값을 1씩 증감시킨다.
  • 증감 연산자는 변수가 아닌 식에는 사용할 수 없다. 예를 들어 (x+y)++는 사용할 수 없다. 또한 실수형에도 적용할 수 없다.
  • 증감 연산자의 종류
연산자 형태 명칭 의미
++ ++a 전위 증가 연산자 연산 전에 a값 증가
a++ 후위 증가 연산자 연산 후에 a값 증가
-- --a 전위 감소 연산자 연산 전에 a값 감소
a-- 후위 감소 연산자 연산 후에 a값 감소

 

전위 증감 연산자와 후위 증감 연산자의 차이

//전위 증가 연산자
a = 5;
x = ++a;
//결과 : x=6, a=6
//이유 : a가 먼저 증가하여 6이 되고, 그 증가된 값이 x에 대입되기 때문이다.

//후위 증가 연산자
a = 5;
x = a++;
//결과 : x=5, a=6
//이유 : a가 먼저 x에 대입되고, 대입된 후에 증가하기 때문이다.

 

 

  • 증감 연산자만 사용했을 떄는 전위와 후위 연산자의 차이는 드러나지 않지만, 다른 연산자와 혼합되어 사용됐을 경우에 그 차이가 나타난다.

대입 연산자

 

대입 연산자

  • 일반적으로 대입 연산자 왼쪽에 기술한 변수에 대입 연산자 오른쪽에 기술한 식의 결과를 저장함.
  • 대입 연산자의 종류
연산자 사용 예 같은 의미의 수식
+= x+=y x=x+y
-= x-=y x=x-y
*= x*=y x=x*y
/= x/=y x=x/y
%= x%=y x=x%y
&= x&=y x=x&y
|= x|=y x=x|y
^= x^=y x=x^y
>>= x>>=y x=x>>y
<<= x<<=y x=<<y

비트 단위 연산자

 

비트 단위 연산자

  • 비트 단위 연산자는 비트 연산자의 비트를 직접 조작하는 데 사용한다.
  • 비트 연산자에서 피연산자는 반드시 정수형이어야 하므로 정수형 피연산자인 char, short, int, long, signed와 unsigned를 다루기 위해 사용한다.
  • 일반적으로는 부호가 없는 정수가 비트 연산자로 사용된다.
  • 비트 연산자의 종류
연산자 명칭 의미
& 비트 논리곱(AND) 두 피연산자의 대응되는 두 비트가 모두 1이면 결과 비트는 1이 된다.
| 비트 논리합 두 피연산자의 대응되는 두 비트 중 적어도 한 비트가 1이면 결과 비트는 1이 된다.
^ 비트 배타적 논리합 두 피연산자의 대응되는 두 비트 중 한 비트가 1이면(두 비트가 서로 다른 비트일 때) 결과 비트는 1이 된다.
<< 왼쪽 이동 두 번째 피연산자의 지정 개수만큼 첫 번째 피연산자의 비트들을 왼쪽으로 이동(시프트)한다. 오른쪽은 0으로 채운다.
>> 오른쪽 이동 두 번째 피연산자의 지정 개수만큼 첫 번째 피연산자의 비트들을 오른쪽으로 이동한다. 왼쪽에 값을 채우는 방법은 시스템에 따라 다르낟.
~ 1의 보수 모든 0비트는 1이 되고 모든 1비트는 0이 된다.

 

비트 AND, 비트 OR, 비트 XOR, 비트NOT 연산자

  • 비트 AND, 비트 OR, 비트 XOR의 연산 결과
대응 피연산자 비트 비트 AND(X&Y) 비트 OR(X|Y) 비트 XOR(X^Y)
X Y
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0
  • 1의 보수(NOT) 연산 결과
피연산자 비트 X 비트 NOT(~X)
0 1
1 0
  • 비트 연산을 위해서는 10진수를 2진수로 변환해야 한다.
    • ex) short x=10, y=6;
      • short는 16비트이므로 10=0000_0000_0000_1010, 6=0000_0000_0000_0110
      • 비트 AND 연산 : 0000_0000_0000_1010 & 0000_0000_0000_0110 = 0000_0000_0000_0010(10&6 = 2)

시프트 연산자

 

시프트 연산자

  • 시프트 연산자는 2진수를 비트 단위로 이동하는 연산자
  • 이동 방향에 따라 왼쪽 시프트 연산자와 오른쪽 시프트 연산자로 구분한다.
  • 시프트 연산자를 사용하면 왼쪽에 오는 피연산자를 2진수로 변환하여 오른쪽에 오는 피연산자 개수만큼 이동한다.
  • 시프트 연산자의 종류
연산자 명칭 사용 예 의미
<< 왼쪽 시프트 연산자 a<<1 a의 값을 왼쪽으로 1비트만큼 이동
>> 오른쪽 시프트 연산자 a>>1 a의 값을 오른쪽으로 1비트만큼 이동

 

시프트 연산자의 실제 연산

  • 시프트 연산을 하기 위해서는 10진수를 2진수로 변환하여야 한다.
  • ex) short x=15; 
    • short는 16비트이므로 15=0000_0000_0000_1111 
    • 왼쪽 시프트 연산자 x<<2;
      • 0000_0000_0011_1100 = 60
      • 2비트씩 왼쪽으로 이동
      • 왼쪽에 두 비트는 저장할 곳이 없으므로 버리고, 오른쪽에 두 비트는 0으로 채운다.
    • 오른쪽 시프트 연산자 x>>2;
      • 0000_0000_0000_0011 = 3
      • 2비트씩 오른쪽으로 이동
      • 왼쪽 빈 곳은 첫번째 비트가 양수면 0으로, 음수면 1로 채워진다. 여기서는 첫번째 비트가 0이므로 0으로 채워진다.  오른쪽의 두 비트는 저장할 곳이 없으므로 버린다.

기타 연산자

 

조건 연산자(conditional operator)

//조건 연산자를 이용해서 최대값 구하기
#include <iostream>
using namespace std;
int main()
{
  int a, b, c;
  int max;
  
  cout << "세 수를 입력하세요 : ";
  cin >> a >> b >> c; //ex) a=5, b=7, c=6
  
  max = (a>b) ? a : b; //결과 : b의 값인 7이 나옴.
  max = (max > c) ? max : c; //위에서 계산한 max의 값이 c보다 크면 max 출력, 아니면 c 출력
  
  cout << "가장 큰 수는 : " << max << "\n"; //결과 : 7, 위의 결과로 max는 7이기 때문
}

  • 조건 연산자는 조건식의 결과인 true와 false에 따라 문장을 골라서 수행하는 연산자로서, 피연산자 3개를 갖는 삼항 연산자이다.
  • 조건식의 결과가 참이면 식1을 거짓이면 식2를 수행한다.
    • 조건식 ? 식1 : 식2;

 

sizeof 연산자

  • sizeof 연산자는 변수명이나 자료형 또는 상숫값에 적용하여 메모리에 차지하는 바이트수를 구하기 위한 연산자
  • 연산 결과로 되돌리는 값은 정수 형태로 바이트 단위로 표시된다.
  • sizeof (자료형 또는 변수 또는 상수)

 

형변환과 캐스트 연산자

  • 형변환 : 대입 연산자를 두고 자료형이 서로 다를 때 대입 연산자 오른쪽의 자료형이 왼쪽에 오는 변수의 자료형에 맞추어서 자료형이 변경되기 때문
    • ex) int a; a=3.5;
    • 정수형 변수 a에 실수형 데이터인 3.5를 대입했지만 a는 정수형이기 때문에 3으로 형변환 되어 저장된다.
  • 형변환은 자료형의 크기 방향에 따라 광역화 형변환협소화 형변환으로 나뉜다.
    • 광역화 형변환
      • 기본 자료형 (int, long, float, double)에 대한 형변환 시에 작은 자료형에서 큰 자료형으로 값이 변환하는 것을 의미
      • 컴파일러에 의해서 자동으로 수행, 이를 '묵시적 형변환'이라고 한다.
    • 협소화 형변환
      • 큰 자료형에서 작은 자료형으로 값이 변환하는 것을 의미
      • 협소화 형변환은 피연산자의 값이 상실될 우려가 있으므로 컴파일러가 경고 메시지를 발생시킨다.
      • 경고를 받지 않으려면 프로그래머가 캐스트 연산자를 사용하여 '명시적 형변환'을 해야 한다.
  • 캐스트 연산자 : ()안에 프로그래머가 식의 자료형에서 바꾸고자 하는 자료형을 기입하면 식의 자료형이 변환된다. (자료형) 식
    • ex) int num = (int) 3.5;
    • 실수값을 정수형으로 변환하면 소수 부분이 잘려지고 3으로 표시 
    • ex) double num = (double) 5;
    • 정수값을 실수형으로 변환하면 소수점 부분이 추가되어 5.0으로 표시

본 게시물은 "C++ 하이킹 객체지향과 만나는 여행"을 기준으로 작성함을 알립니다.

 

'C++ > 이론' 카테고리의 다른 글

[C++] 보조 제어문 (break문, continue문)  (0) 2023.09.30
[C++] 반복문 (for문, while문)  (0) 2023.09.29
[C++] 제어문과 선택문(if~else 문, switch 문)  (0) 2023.09.28
[C++] 자료형  (0) 2023.09.06
[C++] C++의 기초  (0) 2023.09.05