[C++] 연산자와 연산자 우선순위
연산자와 우선순위Permalink
연산자Permalink
연산자(Operator)란 프로그램에서 특정 작업을 수행하는 데 사용되는 기호 또는 키워드를 말합니다.
피연산자(operand) 데이터에 대해 여러가지 작업을 수행할 수 있습니다.
연산자는 각각 특정한 연산을 수행하며 그 결과를 반환합니다.
산술 연산자Permalink
산술 연산자(Arithmetic Operator)란 수학적 계산에 사용되는 연산자들입니다.
덧셈, 뺄셈, 곱셈, 나눗셈, 나머지 연산이 필요할 때 사용합니다.
연산자 | 설명 |
---|---|
+ | 왼쪽 항에 오른쪽 항의 값을 더한다. |
- | 왼쪽 항에 오른쪽 항의 값을 뺀다. |
* | 왼쪽 항에 오른쪽 항의 값을 곱한다. |
/ | 왼쪽 항을 오른쪽 항의 값으로 나눈다. |
% | 왼쪽 항을 오른쪽 항의 값으로 나눈 나머지 |
이항 연산자로 피연산자가 2개입니다.
피연산자가 float이나 double일 때 소수점까지 연산됩니다.
연산자 오버로딩을 통해 다른 클래스에 대해 다른 의미의 연산자를 위한 연산자를 정의할 수 있습니다.
int a = 5;
int b = 2;
a + b; // 7
a - b; // 3
a * b; // 10
a / b; // 2
a % b; // 1
대입 연산자Permalink
대입 연산자(Assignment Operator)는 변수에 값을 대입할 때 사용합니다.
대입 연산자는 위의 산술 연산자와 결합한 복합 대입 연산자가 있습니다. 할당 연산자, 복합 할당 연산자로도 불립니다.
이항 연산자로 피연산자가 2개입니다.
산술 연산자와 다르게 오른쪽 항에서 왼쪽 항으로 대입됩니다.
연산자 | 설명 |
---|---|
= | 왼쪽 항에 오른쪽 항을 대입한다. |
+= | 왼쪽 항에 오른쪽 항을 더한 후 그 값을 왼쪽 항에 대입한다. |
-= | 왼쪽 항에 오른쪽 항을 뺀 후 그 값을 왼쪽 항에 대입한다. |
*= | 왼쪽 항에 오른쪽 항을 곱한 후 그 값을 왼쪽 항에 대입한다. |
/= | 왼쪽 항에 오른쪽 항을 나눈 후 그 값을 왼쪽 항에 대입한다. |
%= | 왼쪽 항에 오른쪽 항을 나눈 후 그 값의 나머지를 왼쪽 항에 대입한다. |
int a = 5;
int b = 5;
int c = 5;
a = a + 3; // 8
b += 5; // 13
c =+ 5; // 5
=+ 연산은 숫자 5를 대입하는 연산이 됐습니다.
이는 연산자의 순서가 다르기 때문인데, 이처럼 복합 대입 연산자는 순서가 매우 중요합니다.
증감 연산자Permalink
증감 연산자(increment and decrement operator)는 피연산자를 1씩 증가시키거나 감소시키는 연산자입니다.
연산자 | 설명 |
---|---|
++x | 피연산자의 값을 1 증가시킨 후에 해당 연산을 진행한다. |
x++ | 해당 연산을 진행한 후에 피연산자의 값을 1 증가시킨다. |
–x | 피연산자의 값을 1 감소시킨 후에 해당 연산을 진행한다. |
x– | 먼저 해당 연산을 진행한 후에 피연산자의 값을 1 감소시킨다. |
연산자가 변수 앞에 있는 경우를 “전위 증감”연산자라고 합니다.
연산자가 변수 뒤에 있는 경우를 “후위 증감”연산자라고 합니다.
전위, 후위의 의미는 다른 연산자와 함께 사용될 때 다른 연산자보다 먼저 처리(전위 증감) 되는가 후에 처리(후위 증감) 되는가를 지정합니다.
int a = 5;
int b = 2;
++a; // 5
a--; // 4
++a + b; // 8
a++ + b; // 8
int c = ++a + b; // 8
int d = a++ + b; // 7
a+++b는 반환된 값이 8입니다. 하지만 int d=a+++b는 반환된 값이 7입니다.
그 이유는 산술 연산자가 수행된 후 대입 연산자가 실행되며, 후위 증감 연산자이기 때문에 대입 연산자가 끝난 후 7에 증감 연산자가 실행 됩니다.
비교 연산자Permalink
비교 연산자(Comparison Operator)는 피연산자 사이의 상대적인 크기를 판단해 불리언 값을 반환하는 연산자입니다.
피연산자들의 결합 방향은 왼쪽에서 오른쪽입니다.
연산자 | 설명 |
---|---|
== | 왼쪽의 피연산자와 오른쪽의 피연산자가 같으면 1을 반환한다. |
!= | 왼쪽의 피연산자와 오른쪽의 피연산자가 다르면 1을 반환한다. |
> | 왼쪽의 피연산자와 오른쪽의 피연산자보다 크면 1을 반환한다. |
>= | 왼쪽의 피연산자와 오른쪽의 피연산자 보다 크거나 같으면 1을 반환한다. |
< | 왼쪽의 피연산자와 오른쪽의 피연산자 보다 작으면 1을 반환한다. |
<= | 왼쪽의 피연산자와 오른쪽의 피연산자 보다 작거나 같으면 1을 반환한다. |
왼쪽의 피연산자와 오른쪽의 피연산자를 비교해 어느 쪽이 더 큰지, 작은지 혹은 서로 같은지를 판단합니다.
int a = 5;
int b = 2;
a == b; // false
a != b; // true
a > b; // true
a >= b; // true
a < b; // false
a <= b; // false
논리 연산자Permalink
논리 연산자(Logical Operator)는 불리언 표현식의 결과를 결정하는 연산자입니다.
AND 연산자와 OR연산자는 두 개의 피연산자를 가지는 이항 연산자입니다.
피연산자들의 결합 방향은 왼쪽에서 오른쪽입니다.
NOT 연산자는 피연산자가 하나뿐인 단항 연산자입니다.
피연산자의 결합 방향은 오른쪽에서 왼쪽입니다.
연산자 | 설명 |
---|---|
&& | 논리식이 모두 참인 경우 1을 반환한다.(AND연산) |
|| | 논리식 중 하나라도 참인 경우 1을 반환한다.(OR연산) |
! | 논리식의 결과가 참이면 0을 거짓이면 1을 반환한다.(NOT) |
비트 연산자Permalink
비트 연산자(Bitwise Operator)는 비트(bit)에 대해 연산을 수행합니다.
피연산자들의 결합 방향은 왼쪽에서 오른쪽입니다.
연산자 | 설명 |
---|---|
& | 두 항의 각 자릿수를 비교해, 비트가 모두 1이면 1을 반환한다.(비트 AND) |
| | 두 항의 각 자릿수를 비교해, 비트 중에서 하나라도 1이면 1을 반환한다.(비트 OR) |
^ | 두 항의 각 자릿수를 비교해, 비트가 서로 다를 경우 1을 반환(비트 XOR) |
~ | 항의 각 자릿수의 비트가 1일경우 0으로, 0일 경우 1로 반환(비트 NOT, 1의 보수) |
« | 지정한 수만큼 비트를 왼쪽으로 이동(Left Shift) |
» | 지정한 수만큼 비트를 오른쪽으로 이동(Right Shift) |
unsigned int a = 0b1010;
unsigned int b = 0b1001;
a & b; // 0000 1000
a | b; // 0000 1011
a ^ b; // 0000 0011;
~a; // 0000 0101;
a << 1 // 0001 0100;
b >> 1 // 0000 0100;
b»1의 경우 왼쪽으로 비트가 이동하면서 가장 왼쪽에 있던 비트가 범위를 넘어가 소실됐습니다.
이렇게 이진수의 끝에서 벗어난 비트는 소실됩니다.
삼항 연산자Permalink
삼항 연산자(Ternary Operator)는 C/C++에서 유일하게 세 개의 피연산자를 가집니다.
간단한 조건으로 값을 반환하는 등 간결한 코드 작성에 사용합니다.
중첩해서 사용하면 가독성이 좋지않습니다.
다음과 같은 문법을 가집니다.
조건식? 반환값1 : 반환값2
조건식이 참이라면 반환값1을 거짓이라면 반환값2를 반환합니다.
int a = 5;
int b = 2;
(a < b) ? a : b; // 2
쉼표 연산자Permalink
쉼표 연산자(Comma Operator)는 두 개의 표현식을 동시에 표현하도록 도와주는 연산자입니다.
피연산자들의 결합 방향은 왼쪽에서 오른쪽입니다.
int a = 5, int b = 2;
항상 왼쪽 피연산자가 실행되고, 모든 파생 작용이 완료된 후에 오른쪽 피연산자가 실행됩니다.
쉼표는 연산자가 아닌 다른 역할로도 사용되는데, 분리자(Seperator)로도 사용됩니다.
분리자는 함수 인수 목록과 같은 일부 컨텍스트에서 구분 기호로 사용될 수 있습니다.
다음은 변수의 선언을 구분해주는 분리자로 사용된 예시입니다.
int a = 5, int b = 2; // 쉼표 연산자
int c, d; // 분리자
범위 지정 연산자Permalink
범위 지정 연산자(Scope Resolution Operator)는 다양한 범위에서 사용되는 식별자(identifier)를 식별하고 명확하게 구분하는 데 사용됩니다.
식별자로는 변수, 함수, 열거체가 올 수 있습니다.
::식별자
클래스이름::식별자
네임스페이스::식별자
열거체::식별자
범위 지정 연산자를 변수의 이름 앞에 붙이면 해당 변수는 전역으로 사용하라는 의미로 쓰입니다.
같은 이름의 변수로 전역변수와 지역변수가 선언 돼있을 경우 전역변수에 접근 할 수 있습니다.
클래스에 사용하면 클래스의 정적 멤버를 호출합니다.
네임 스페이스에 사용하면 네임스페이스의 변수나 함수들을 호출할 수 있습니다.
멤버 포인터 연산자Permalink
멤버 포인터 연산자(Pointer-to-Member Operator)는 피연산자에 대한 특정 클래스 멤버의 값을 반환합니다.
피연산자들의 결합 방향은 왼쪽에서 오른쪽입니다.
연산자는 다음과 같이 두 가지의 형태가 있습니다.
- 왼쪽의 피연산자가 클래스 타입의 객체인 경우: .*
- 왼쪽의 피연산자가 클래스 객체에 대한 포인터인 경우: ->*
다음과 같은 문법을 가집니다.
클래스 타입의 객체.*멤버이름
클래스 객체에 대한 포인터->*멤버이름
멤버 포인터 연산자는 정적 멤버 변수를 가리킬 수 없으며, 레퍼런스 멤버도 가리킬 수 없습니다.
sizeof 연산자Permalink
sizeof 연산자는 피연산자의 타입이 차지하는 메모리 크기를 바이트(byte) 단위로 반환합니다.
피연산자는 변수와 상수 또는 타입 자체일 수 있습니다.
int a = 5;
sizeof(char); // 1
sizeof(short); // 2
sizeof(a); // 4
typeid 연산자Permalink
typeid 연산자는 런타임에 객체의 타입을 확인할 수 있습니다.
자료형이나 변수, 식을 받아 const type_info& 형식의 객체를 반환합니다.
반환된 값은 복사생성자나 대입연산자 사용이 금지돼있습니다.
연산자 우선순위Permalink
연산자 우선순위(Operator Precedence)는 다음과 같습니다.
연산순위 | 연산자 | 설명 | 결합 방향 |
---|---|---|---|
1 | :: |
범위 지정 (scope resolution) | 좌 → 우 |
2 | . 또는 -> |
멤버 액세스 | |
[] |
배열 첨자 | ||
() |
함수 호출 | ||
++ 또는 -- |
후위 증가와 감소 | ||
typeid |
타입 이름 | ||
const_cast |
상수 타입 변환 | ||
dynamic_cast |
동적 타입 변환 | ||
reinterpret_cast |
재해석 타입 변환 | ||
static_cast |
정적 타입 변환 | ||
3 | sizeof |
개체 또는 타입의 크기 | 우 → 좌 |
++ 또는 -- |
전위 증가와 감소 | ||
! 또는 ~ |
논리 NOT, 비트 NOT | ||
- 또는 + |
음의 부호, 양의 부호 | ||
& |
주소값 | ||
* |
역참조 | ||
new 또는 new[] |
동적 메모리 할당 | ||
delete 또는 delete[] |
동적 메모리 해제 | ||
(type) |
타입 캐스트 | ||
4 | .* 또는 .-> |
멤버 포인터 | 좌 → 우 |
5 | * 또는 / 또는 % |
곱셈, 나누기, 나머지 | |
6 | + 또는 - |
더하기, 빼기 | |
7 | << 또는 >> |
비트 왼쪽 시프트와 오른쪽 시프트 | |
8 | < 또는 <= |
비교(관계)연산자 < 와 ≤ | |
> 또는 >= |
비교(관계)연산자 > 와 ≥ | ||
9 | == 또는 != |
비교(관계)연산자 = 와 ≠ | |
10 | & |
비트 AND | |
11 | ^ |
배타적 비트 OR | |
12 | | |
포괄적 비트 OR | |
13 | && |
논리적 AND | |
14 | || |
논리적 OR | |
15 | ?: |
삼항 연산자(조건 연산자) | 우 → 좌 |
= |
직접 대입 | ||
*= 또는 /= 또는 %= |
곱, 몫, 나머지 대입 | ||
+= 또는 -= |
합과 차 대입 | ||
<<= 또는 >>= |
비트 왼쪽 쉬프트와 오른쪽 쉬프트 후 할당 | ||
&= 또는 ^= 또는 |= |
비트 AND, 배타적 비트 OR, 포괄적 비트 OR 대입 | ||
16 | throw |
(예외를 위한)Throw 연산자 | |
17 | , |
쉼표 | 좌 → 우 |
댓글남기기