C++의 복합 할당 연산자(compound assignment operator)는 e1 op= e2 형태로 표현됩니다. 여기서 e1은 const 타입이 아닌, 수정 가능한 l-value여야 하며 e2는 다음 중 하나여야 합니다.
- 산술 타입(arithmetic type)
- 포인터 타입 — 단, 연산자(op)가 + 또는 -인 경우에 한함
e1 op= e2는 e1 = e1 op e2와 동일하게 동작하지만, 결정적인 차이점은 e1이 단 한 번만 평가된다는 것입니다. 덕분에 코드가 더 간결해지고, 부작용(side effect)이 중복으로 발생할 위험도 줄어듭니다.
C++ 복합 할당 연산자의 종류
C++에서 제공하는 복합 할당 연산자는 다음과 같습니다.
| 연산자 | 설명 |
|---|---|
| *= | 첫 번째 피연산자의 값에 두 번째 피연산자의 값을 곱한 후, 결과를 첫 번째 피연산자가 지정하는 객체에 저장합니다. |
| /= | 첫 번째 피연산자의 값을 두 번째 피연산자의 값으로 나눈 후, 결과를 첫 번째 피연산자가 지정하는 객체에 저장합니다. |
| %= | 첫 번째 피연산자를 두 번째 피연산자의 값으로 나눈 나머지(모듈러스)를 구한 후, 결과를 첫 번째 피연산자가 지정하는 객체에 저장합니다. |
| += | 첫 번째 피연산자의 값에 두 번째 피연산자의 값을 더한 후, 결과를 첫 번째 피연산자가 지정하는 객체에 저장합니다. |
| -= | 첫 번째 피연산자의 값에서 두 번째 피연산자의 값을 뺀 후, 결과를 첫 번째 피연산자가 지정하는 객체에 저장합니다. |
| <<= | 첫 번째 피연산자의 값을 두 번째 피연산자 값이 지정하는 비트 수만큼 왼쪽으로 시프트한 후, 결과를 첫 번째 피연산자가 지정하는 객체에 저장합니다. |
| >>= | 첫 번째 피연산자의 값을 두 번째 피연산자 값이 지정하는 비트 수만큼 오른쪽으로 시프트한 후, 결과를 첫 번째 피연산자가 지정하는 객체에 저장합니다. |
| &= | 두 피연산자의 비트별 AND 연산을 수행한 후, 결과를 첫 번째 피연산자가 지정하는 객체에 저장합니다. |
| ^= | 두 피연산자의 비트별 배타적 OR(XOR) 연산을 수행한 후, 결과를 첫 번째 피연산자가 지정하는 객체에 저장합니다. |
| |= | 두 피연산자의 비트별 포함적 OR 연산을 수행한 후, 결과를 첫 번째 피연산자가 지정하는 객체에 저장합니다. |
예제 코드
주요 복합 할당 연산자들의 실제 동작을 확인해 보겠습니다.
#include<iostream>
using namespace std;
int main() {
int a = 3, b = 2;
a += b; // a = a + b
cout << a << endl;
a -= b; // a = a - b
cout << a << endl;
a *= b; // a = a * b
cout << a << endl;
a /= b; // a = a / b
cout << a << endl;
return 0;
}실행 결과
위 코드를 실행하면 다음과 같은 출력이 나옵니다.
5 3 6 3
각 단계마다 a의 값이 갱신되며, 이전 연산의 결과가 다음 연산에 그대로 반영되는 것을 확인할 수 있습니다.
사용 시 주의 사항
복합 할당 연산자를 사용할 때는 다음 사항을 유의해야 합니다.
- 열거형(enum) 타입에 대한 복합 할당은 컴파일 오류 메시지를 발생시킵니다.
- 왼쪽 피연산자가 포인터 타입이라면, 오른쪽 피연산자 역시 포인터 타입이거나 0으로 평가되는 상수 표현식이어야 합니다.
- 왼쪽 피연산자가 정수형(integral type)이라면, 오른쪽 피연산자는 포인터 타입이 아니어야 합니다.
이러한 규칙을 지키면 복합 할당 연산자를 활용해 더 짧고 읽기 쉬운 C++ 코드를 작성할 수 있습니다.