대입 연산자

구문

expression assignment-operator expression

assignment-operator: 다음 중 하나
=*=/=%=+=-=<<=>>=&=^=|=

설명

할당 연산자는 왼쪽 피연산자가 지정한 개체에 값을 저장합니다. 할당 작업에는 두 가지 종류가 있습니다.

  • 두 번째 피연산자의 값이 첫 번째 피연산자가 지정한 개체에 저장되는 간단한 할당.

  • 결과를 저장하기 전에 산술, 시프트 또는 비트 연산이 수행되는 복합 할당.

= 연산자를 제외한 다음 표의 모든 대입 연산자는 복합 할당 연산자입니다.

대입 연산자 테이블

연산자 의미
= 첫 번째 피연산자에서 지정한 개체에 두 번째 피연산자의 값을 저장합니다(단순 할당).
*= 첫 번째 피연산자의 값과 두 번째 피연산자의 값을 곱하여 첫 번째 피연산자가 지정한 개체에 결과를 저장합니다.
/= 첫 번째 피연산자의 값을 두 번째 피연산자의 값으로 나누어 첫 번째 피연산자가 지정한 개체에 결과를 저장합니다.
%= 두 번째 피연산자의 값에서 지정한 첫 번째 피연산자의 모듈러스를 가져와서 첫 번째 피연산자가 지정한 개체에 결과를 저장합니다.
+= 두 번째 연산자의 값과 첫 번째 연산자의 값을 더하여 첫 번째 피연산자가 지정한 개체에 결과를 저장합니다.
-= 첫 번째 피연산자의 값에서 두 번째 피연산자의 값을 빼서 첫 번째 피연산자가 지정한 개체에 결과를 저장합니다.
<<= 두 번째 피연산자의 값에서 지정한 비트 수만큼 첫 번째 피연산자의 값을 왼쪽으로 이동하여 첫 번째 피연산자가 지정한 개체에 결과를 저장합니다.
>>= 두 번째 피연산자의 값에서 지정한 비트 수만큼 첫 번째 피연산자의 값을 오른쪽으로 이동하여 첫 번째 피연산자가 지정한 개체에 결과를 저장합니다.
&= 첫 번째 및 두 번째 피연산자의 비트 AND를 구하여 첫 번째 피연산자가 지정한 개체에 결과를 저장합니다.
^= 첫 번째 및 두 번째 피연산자의 비트 배타적 OR를 구하여 첫 번째 피연산자가 지정한 개체에 결과를 저장합니다.
|= 첫 번째 및 두 번째 피연산자의 비트 포함 OR를 구하여 첫 번째 피연산자가 지정한 개체에 결과를 저장합니다.

연산자 키워드

복합 할당 연산자 중 3개에는 해당하는 키워드가 있습니다. 화면은 다음과 같습니다.

연산자 해당
&= and_eq
|= or_eq
^= xor_eq

C++는 복합 할당 연산자의 대체 맞춤법으로 이러한 연산자 키워드를 지정합니다. C에서 대체 맞춤법은 <iso646.h> 헤더에 매크로로 제공됩니다. C++에서 대체 맞춤법은 키워드입니다. <iso646.h> 또는 C++ 동등한 <ciso646> 사용은 더 이상 사용되지 않습니다. Microsoft C++에서는 대체 맞춤법을 사용하도록 설정하려면 /permissive- 또는 /Za 컴파일러 옵션이 필요합니다.

예시

// expre_Assignment_Operators.cpp
// compile with: /EHsc
// Demonstrate assignment operators
#include <iostream>
using namespace std;
int main() {
   int a = 3, b = 6, c = 10, d = 0xAAAA, e = 0x5555;

   a += b;      // a is 9
   b %= a;      // b is 6
   c >>= 1;      // c is 5
   d |= e;      // Bitwise--d is 0xFFFF

   cout  << "a = 3, b = 6, c = 10, d = 0xAAAA, e = 0x5555" << endl
         << "a += b yields " << a << endl
         << "b %= a yields " << b << endl
         << "c >>= 1 yields " << c << endl
         << "d |= e yields " << hex << d << endl;
}

단순 할당

단순 대입 연산자(=)를 사용하면 두 번째 피연산자의 값이 첫 번째 피연산자가 지정한 개체에 저장됩니다. 두 개체가 모두 산술 형식인 경우 값을 저장하기 전에 오른쪽 피연산자를 왼쪽 형식으로 변환합니다.

constvolatile 형식의 개체는 오직 volatile 이거나 const 또는 volatile가 아닌 형식의 l 값에 할당할 수 있습니다.

클래스 형식(struct, unionclass 형식)의 개체에 대한 할당은 operator=라고 불리는 함수에 의해 수행됩니다. 이 연산자 함수의 기본 동작은 개체의 비정적 데이터 멤버 및 직접 기본 클래스의 멤버 단위 복사 할당을 수행하는 것입니다. 그러나 이 동작은 오버로드된 연산자를 사용하여 수정할 수 있습니다. 자세한 내용은 연산자 오버로드를 참조하세요. 클래스 형식에는 복사 할당이동 할당 연산자가 있을 수 있습니다. 자세한 내용은 복사 생성자 및 복사 할당 연산자이동 생성자 및 이동 할당 연산자를 참조하세요.

지정된 기본 클래스에서 명확히 파생된 모든 클래스의 개체는 기본 클래스의 개체에 할당될 수 있습니다. 파생 클래스에서 기본 클래스로의 암시적 변환이 있지만 기본 클래스에서 파생 클래스로 변환되지 않으므로 반대의 경우는 true가 아닙니다. 예시:

// expre_SimpleAssignment.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
class ABase
{
public:
    ABase() { cout << "constructing ABase\n"; }
};

class ADerived : public ABase
{
public:
    ADerived() { cout << "constructing ADerived\n"; }
};

int main()
{
    ABase aBase;
    ADerived aDerived;

    aBase = aDerived; // OK
    aDerived = aBase; // C2679
}

참조 형식에 대한 할당은 참조가 가리키는 개체에 할당이 수행되는 것처럼 작동합니다.

클래스 형식 개체의 경우 할당은 초기화와 다릅니다. 할당과 초기화가 어떻게 다를 수 있는지를 알아보려면 다음 코드를 살펴보세요.

UserType1 A;
UserType2 B = A;

위의 코드에서는 이니셜라이저를 보여 줍니다. 여기에서는 UserType2 형식의 인수를 사용하는 UserType1의 생성자를 호출합니다. 다음 코드에서

UserType1 A;
UserType2 B;

B = A;

아래의 할당 문은

B = A;

다음과 같은 결과 중 하나를 생성할 수 있습니다.

  • operator=(이)가 UserType1인수와 함께 제공된 경우 함수 UserType2에 대해 operator= 함수를 호출합니다.

  • 명시적 변환 함수 UserType1::operator UserType2를 호출합니다(이러한 함수가 있는 경우).

  • UserType2::UserType2 인수를 사용하고 결과를 복사하는 생성자 UserType1를 호출합니다(이러한 생성자가 있는 경우).

복합 할당

복합 할당 연산자는 대입 연산자 테이블에 표시됩니다. 이러한 연산자에는 e1op= e2 양식이 있습니다. 여기서 e1은 수정할 수 const 없는 l-value이고 e2는 다음과 같습니다.

  • 산술 형식

  • op+ 또는 -인 경우 포인터

  • e1 형식에 대해 일치하는operator *op*= 오버로드가 있는 형식입니다.

기본 제공 e1op= e2 양식은 e1=e1ope2으로 동작합니다. 그러나 e1(은)는 한 번만 평가됩니다.

열거 형식에 대한 복합 할당은 오류 메시지를 생성합니다. 왼쪽 피연산자의 포인터 형식이면 오른쪽 피연산자는 포인터 형식이거나 0으로 계산되는 상수 식이어야 합니다. 왼쪽 피연산자는 정수 형식인 경우 오른쪽 피연산자는 포인터 형식이 아니어야 합니다.

기본 제공 할당 연산자의 결과

기본 제공 대입 연산자는 할당 후 왼쪽 피연산자가 지정한 개체의 값과 복합 할당 연산자의 경우 산술/논리 연산을 반환합니다. 결과 형식은 왼쪽 피연산자의 형식입니다. 할당 식의 결과는 항상 l-value입니다. 이러한 연산자는 오른쪽에서 왼쪽으로 결합됩니다. 왼쪽 피연산자는 수정 가능한 l-value여야 합니다.

ANSI C에서 할당 식의 결과는 l-value가 아닙니다. 즉, 법적 C++ 식 (a += b) += c(은)는 C에서 허용되지 않습니다.

참고 항목

이항 연산자가 있는 식
C++ 기본 제공 연산자, 우선 순위 및 결합성
C 대입 연산자