대입 연산자Assignment operators

구문Syntax

대입 연산자 expression assignment-operator expression

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

설명Remarks

할당 연산자는 왼쪽 피연산자로 지정 된 개체에 값을 저장 합니다.Assignment operators store a value in the object specified by the left operand. 할당 작업에는 다음과 같은 두 가지 종류가 있습니다.There are two kinds of assignment operations:

  • 단순 할당-두 번째 피연산자의 값이 첫 번째 피연산자가 지정한 개체에 저장 됩니다.simple assignment, in which the value of the second operand is stored in the object specified by the first operand.

  • 결과를 저장 하기 전에 산술, 시프트 또는 비트 연산을 수행 하는 복합 할당입니다.compound assignment, in which an arithmetic, shift, or bitwise operation is performed before storing the result.

연산자를 제외 하 고 다음 표의 모든 할당 연산자 = 는 복합 할당 연산자입니다.All assignment operators in the following table except the = operator are compound assignment operators.

할당 연산자 표Assignment operators table

연산자Operator 의미Meaning
= 첫 번째 피연산자에서 지정한 개체에 두 번째 피연산자의 값을 저장합니다(단순 할당).Store the value of the second operand in the object specified by the first operand (simple assignment).
*= 첫 번째 피연산자의 값과 두 번째 피연산자의 값을 곱하여 첫 번째 피연산자가 지정한 개체에 결과를 저장합니다.Multiply the value of the first operand by the value of the second operand; store the result in the object specified by the first operand.
/= 첫 번째 피연산자의 값을 두 번째 피연산자의 값으로 나누어 첫 번째 피연산자가 지정한 개체에 결과를 저장합니다.Divide the value of the first operand by the value of the second operand; store the result in the object specified by the first operand.
%= 두 번째 피연산자의 값에서 지정한 첫 번째 피연산자의 모듈러스를 가져와서 첫 번째 피연산자가 지정한 개체에 결과를 저장합니다.Take modulus of the first operand specified by the value of the second operand; store the result in the object specified by the first operand.
+= 두 번째 연산자의 값과 첫 번째 연산자의 값을 더하여 첫 번째 피연산자가 지정한 개체에 결과를 저장합니다.Add the value of the second operand to the value of the first operand; store the result in the object specified by the first operand.
-= 첫 번째 피연산자의 값에서 두 번째 피연산자의 값을 빼서 첫 번째 피연산자가 지정한 개체에 결과를 저장합니다.Subtract the value of the second operand from the value of the first operand; store the result in the object specified by the first operand.
<<= 두 번째 피연산자의 값에서 지정한 비트 수만큼 첫 번째 피연산자의 값을 왼쪽으로 이동하여 첫 번째 피연산자가 지정한 개체에 결과를 저장합니다.Shift the value of the first operand left the number of bits specified by the value of the second operand; store the result in the object specified by the first operand.
>>= 두 번째 피연산자의 값에서 지정한 비트 수만큼 첫 번째 피연산자의 값을 오른쪽으로 이동하여 첫 번째 피연산자가 지정한 개체에 결과를 저장합니다.Shift the value of the first operand right the number of bits specified by the value of the second operand; store the result in the object specified by the first operand.
&= 첫 번째 및 두 번째 피연산자의 비트 AND를 구하여 첫 번째 피연산자가 지정한 개체에 결과를 저장합니다.Obtain the bitwise AND of the first and second operands; store the result in the object specified by the first operand.
^= 첫 번째 및 두 번째 피연산자의 비트 배타적 OR를 구하여 첫 번째 피연산자가 지정한 개체에 결과를 저장합니다.Obtain the bitwise exclusive OR of the first and second operands; store the result in the object specified by the first operand.
|= 첫 번째 및 두 번째 피연산자의 비트 포함 OR를 구하여 첫 번째 피연산자가 지정한 개체에 결과를 저장합니다.Obtain the bitwise inclusive OR of the first and second operands; store the result in the object specified by the first operand.

연산자 키워드Operator keywords

세 개의 복합 할당 연산자에는 해당 하는 키워드가 있습니다.Three of the compound assignment operators have keyword equivalents. 아래에 이 계정과 키의 예제가 나와 있습니다.They are:

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

C + +에서는 이러한 연산자 키워드를 복합 할당 연산자에 대 한 대체 철자로 지정 합니다.C++ specifies these operator keywords as alternative spellings for the compound assignment operators. C에서는 대체 철자를 헤더에 매크로로 제공 합니다 <iso646.h> .In C, the alternative spellings are provided as macros in the <iso646.h> header. C + +에서 대체 철자는 키워드입니다. <iso646.h>또는이에 해당 하는 c + +는 사용 <ciso646> 되지 않습니다.In C++, the alternative spellings are keywords; use of <iso646.h> or the C++ equivalent <ciso646> is deprecated. Microsoft c + +에서 /permissive- 또는 /Za 컴파일러 옵션은 대체 철자를 사용 하도록 설정 하는 데 필요 합니다.In Microsoft C++, the /permissive- or /Za compiler option is required to enable the alternative spelling.

예제Example

// 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;
}

단순 할당Simple assignment

단순 할당 연산자 ( = )는 두 번째 피연산자의 값이 첫 번째 피연산자로 지정 된 개체에 저장 되도록 합니다.The simple assignment operator (=) causes the value of the second operand to be stored in the object specified by the first operand. 두 개체가 모두 산술 형식이 면 오른쪽 피연산자는 값을 저장 하기 전에 왼쪽의 형식으로 변환 됩니다.If both objects are of arithmetic types, the right operand is converted to the type of the left, before storing the value.

및 형식의 개체는 또는이 아닌 const volatile 형식의 l-value에 할당할 수 있습니다 volatile const volatile .Objects of const and volatile types can be assigned to l-values of types that are only volatile, or that aren't const or volatile.

클래스 형식 (, 및 형식)의 개체에 대 한 할당 struct union class 은 라는 함수에 의해 수행 됩니다 operator= .Assignment to objects of class type (struct, union, and class types) is performed by a function named operator=. 이 연산자 함수의 기본 동작은 비트 복사를 수행하는 것이지만, 이 동작은 오버로드된 연산자를 사용하여 수정할 수 있습니다.The default behavior of this operator function is to perform a bitwise copy; however, this behavior can be modified using overloaded operators. 자세한 내용은 연산자 오버로드를 참조하세요.For more information, see Operator overloading. 클래스 형식에는 복사 할당이동 할당 연산자도 있을 수 있습니다.Class types can also have copy assignment and move assignment operators. 자세한 내용은 복사 생성자 및 복사 할당 연산자이동 생성자 및 이동 할당 연산자를 참조 하세요.For more information, see Copy constructors and copy assignment operators and Move constructors and move assignment operators.

지정된 기본 클래스에서 명확히 파생된 모든 클래스의 개체는 기본 클래스의 개체에 할당될 수 있습니다.An object of any unambiguously derived class from a given base class can be assigned to an object of the base class. 파생 클래스에서 기본 클래스로의 암시적 변환이 있지만 기본 클래스에서 파생 클래스로의 암시적 변환이 없기 때문에 반대의 경우도 마찬가지입니다.The reverse isn't true because there's an implicit conversion from derived class to base class, but not from base class to derived class. 예를 들면 다음과 같습니다.For example:

// 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
}

참조 형식에 대한 할당은 참조가 가리키는 개체에 할당이 수행되는 것처럼 작동합니다.Assignments to reference types behave as if the assignment were being made to the object to which the reference points.

클래스 형식 개체의 경우 할당은 초기화와 다릅니다.For class-type objects, assignment is different from initialization. 할당과 초기화가 어떻게 다를 수 있는지를 알아보려면 다음 코드를 살펴보세요.To illustrate how different assignment and initialization can be, consider the code

UserType1 A;
UserType2 B = A;

위의 코드에서는 이니셜라이저를 보여 줍니다. 여기에서는 UserType2 형식의 인수를 사용하는 UserType1의 생성자를 호출합니다.The preceding code shows an initializer; it calls the constructor for UserType2 that takes an argument of type UserType1. 다음 코드에서Given the code

UserType1 A;
UserType2 B;

B = A;

아래의 할당 문은the assignment statement

B = A;

다음과 같은 결과 중 하나를 생성할 수 있습니다.can have one of the following effects:

  • operator= UserType2 operator= 인수를 사용 하 여 제공 되는 경우에 대 한 함수를 호출 합니다 UserType1 .Call the function operator= for UserType2, provided operator= is provided with a UserType1 argument.

  • 명시적 변환 함수 UserType1::operator UserType2를 호출합니다(이러한 함수가 있는 경우).Call the explicit conversion function UserType1::operator UserType2, if such a function exists.

  • UserType2::UserType2 인수를 사용하고 결과를 복사하는 생성자 UserType1를 호출합니다(이러한 생성자가 있는 경우).Call a constructor UserType2::UserType2, provided such a constructor exists, that takes a UserType1 argument and copies the result.

복합 할당Compound assignment

복합 할당 연산자는 할당 연산자 테이블에 표시 됩니다.The compound assignment operators are shown in the Assignment operators table. 이러한 연산자에는 e1 op = e2형식이 있습니다. 여기서 e1 은 수정할 수 없는 const l-value이 고 e2 는 다음과 같습니다.These operators have the form e1 op= e2, where e1 is a non-const modifiable l-value and e2 is:

  • 산술 형식an arithmetic type

  • 포인터 ( op 가 또는 인 경우) +****-a pointer, if op is + or -

E1 op = e2 폼은 e1 = e1 op e2로 동작 하지만 e1 은 한 번만 평가 됩니다.The e1 op= e2 form behaves as e1 = e1 op e2, but e1 is evaluated only once.

열거 형식에 대한 복합 할당은 오류 메시지를 생성합니다.Compound assignment to an enumerated type generates an error message. 왼쪽 피연산자가 포인터 형식이 면 오른쪽 피연산자가 포인터 형식 이어야 합니다. 그렇지 않으면 0으로 계산 되는 상수 식 이어야 합니다.If the left operand is of a pointer type, the right operand must be of a pointer type, or it must be a constant expression that evaluates to 0. 왼쪽 피연산자가 정수 계열 형식이 면 오른쪽 피연산자가 포인터 형식이 아니어야 합니다.When the left operand is of an integral type, the right operand must not be of a pointer type.

할당 연산자의 결과Result of assignment operators

대입 연산자는 할당된 후 왼쪽 피연산자에서 지정한 개체 값을 반환합니다.The assignment operators return the value of the object specified by the left operand after the assignment. 결과 형식은 왼쪽 피연산자의 형식입니다.The resultant type is the type of the left operand. 할당 식의 결과는 항상 l-value입니다.The result of an assignment expression is always an l-value. 이러한 연산자는 오른쪽에서 왼쪽으로 결합됩니다.These operators have right-to-left associativity. 왼쪽 피연산자는 수정 가능한 l-value여야 합니다.The left operand must be a modifiable l-value.

ANSI C에서 대입 식의 결과는 l-value가 아닙니다.In ANSI C, the result of an assignment expression isn't an l-value. 즉, C에서는 유효한 c + + 식이 (a += b) += c 허용 되지 않습니다.That means the legal C++ expression (a += b) += c isn't allowed in C.

참고 항목See also

이항 연산자로 구성된 식Expressions with binary operators
C + + 기본 제공 연산자, 우선 순위 및 결합성C++ built-in operators, precedence, and associativity
C 할당 연산자C assignment operators