728x90
연산자(operator)
연산자
- 변수와 상수 등의 데이터를 대상인 피연산자(operand)에 대해 연산 동작을 행하는 기호
- C++에서 사용할 수 있는 연산자에는 산술, 관계, 논리, 증감, 대입, 비트, sizeof, 캐스트 연산자 등이 있다.
산술 연산자(arithmetic operator)
산술 연산자
- 산술 연산자는 피연산자에 대한 덧셈, 뺄셈, 곱셈, 나눗셈을 하는 연산자다.
- 산술 연산자의 주의 사항
- 피연산자의 자료형에 의해서 결과값이 달라질 수 있다.
- 이항 연산자 중 나머지를 구하는 %는 정수형 데이터만 피연산자로 취할 수 있다.
- 산술 연산자의 종류
구분
|
연산자
|
표현
|
의미
|
단항 연산자
|
+
|
+3
|
양수
|
-
|
-2
|
음수
|
|
이항 연산자
|
+
|
3 + 2
|
덧셈
|
-
|
3 - 2
|
뺄셈
|
|
*
|
3 * 2
|
곱셉
|
|
/
|
3 / 2
|
나눗셈
|
|
%
|
3 % 2
|
나머지
|
산술 연산자의 우선순위
- 괄호 안에 있는 연산자가 가장 먼저 계산된다. 괄호 여러 개가 중첩되어 있을 경우 가장 안쪽의 괄호가 먼저 계산된다.
- *(곱셈), /(몫을 구하는 나눗셈), %(나머지를 구하는 나눗셈) 연산자가 다음으로 계산된다. *, /, % 등 연산자가 여러 개 있을 경우 왼쪽에서 오른쪽으로 연산이 실행된다. 이 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)
- ex) short x=10, y=6;
시프트 연산자
시프트 연산자
- 시프트 연산자는 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 |