Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 대입 연산자 완벽 정리: 단순 대입부터 복합 대입까지

대입(할당) 연산자는 왼쪽 피연산자가 지정하는 객체에 값을 저장하는 연산자입니다. C++의 대입 연산은 크게 두 가지로 나뉩니다.

단순 대입(Simple Assignment): 두 번째 피연산자의 값을 첫 번째 피연산자가 지정한 객체에 그대로 저장합니다.
복합 대입(Compound Assignment): 산술, 시프트 또는 비트 연산을 먼저 수행한 뒤 그 결과를 저장합니다.

단순 대입 연산자 예제

가장 기본적인 단순 대입 연산자(=)의 사용 예시입니다.

#include<iostream>
using namespace std;
int main() {
   int i;
   i = 10;    // 단순 대입
   cout << i;
   return 0;
}

실행 결과

10

복합 대입 연산자란?

복합 대입 연산자는 e1 op= e2 형태로 표현됩니다. 이때 e1은 const 타입이 아닌 수정 가능한 l-value여야 하며, e2는 다음 중 하나여야 합니다.

  • 산술 타입(arithmetic type)
  • 포인터 타입 (단, op가 + 또는 - 인 경우에 한함)

e1 op= e2 형태는 e1 = e1 op e2와 동일하게 동작하지만, e1은 한 번만 평가된다는 점이 다릅니다. 이는 부작용(side effect)이 있는 표현식에서 중요한 차이를 만듭니다.

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

복합 대입 연산자 사용 시 주의사항

복합 대입 연산자를 사용할 때는 다음 사항들을 유의해야 합니다.

  • 열거형(enum) 타입 제한: 열거형 타입에 대한 복합 대입은 컴파일 오류 메시지를 생성합니다.
  • 포인터 타입 규칙: 왼쪽 피연산자가 포인터 타입이라면, 오른쪽 피연산자 역시 포인터 타입이거나 0으로 평가되는 상수 표현식이어야 합니다.
  • 정수 타입 규칙: 왼쪽 피연산자가 정수 타입이라면, 오른쪽 피연산자는 포인터 타입이 아니어야 합니다.

이러한 규칙을 잘 이해하고 있으면 타입 불일치로 인한 컴파일 오류를 예방하고, 더 안전하고 효율적인 C++ 코드를 작성할 수 있습니다.