확장 할당

Augmented assignment

증강 할당(또는 복합 할당)은 특정 프로그래밍 언어(특히 C에서 파생된 언어)에서 특정 할당 운영자에게 주어진 이름입니다.증강 할당은 일반적으로 연산자가 변수를 인수 중 하나로 받아들이고 결과를 동일한 변수에 다시 할당하는 문을 대체하기 위해 사용됩니다.간단한 예로는x += 1로 확장됩니다.x = x + (1). 다양한 바이너리 연산자에 대해 유사한 구성을 사용할 수 있습니다.

일반적으로 이 기능을 제공하는 언어에서는 변수를 인수 중 하나로 사용하여 동일한 유형의 결과를 반환할 수 있는 대부분의 연산자는 산술 연산자, 비트 시프트 연산자 및 비트 단위 연산자를 포함하여 결과를 해당 변수에 다시 할당하는 확장 할당 등가물을 가지고 있습니다.

논의

예를 들어, 다음과 같은 문이나 문장의 일부 변형은 많은 프로그램에서 볼 수 있습니다.

x = x + 1

즉, "변수에 저장된 번호를 찾습니다.x에 1을 더하고 변수 x에 추가 결과를 저장합니다." 이렇게 단순해 보이는 것처럼 식 중 두 부분이 동일한 것을 컴파일러가 인식하지 못할 경우 변수 x의 위치가 두 번 검색되어야 합니다.x는 배열 요소 또는 기타 복잡성에 대한 참조일 수 있습니다.이에 비해, 다음은 증강된 할당 버전입니다.

x + = 1

이 버전에서는 컴파일러가 변수 x의 위치를 한 번만 찾아보고 수정하는 코드를 생성하지 못한 것은 변명의 여지가 없습니다.물론 머신코드가 이러한 시퀀스를 지원한다면 말입니다.예를 들어 x가 단순 변수일 경우 기계 코드 시퀀스는 다음과 같습니다.

로드 x 1 스토어 추가 x

두 양식 모두 동일한 코드가 생성됩니다.하지만 특별한 운영 코드가 있다면

MDM x, 1

x에 1을 더하면 "메모리 수정"을 의미하며, 제대로 된 컴파일러는 두 형식 모두에서 동일한 코드를 생성합니다.INC 및 DEC 연산을 제공하는 기계 코드도 있고 (1을 더하거나 빼기 위해) 다른 상수를 허용하는 기계 코드도 있습니다.

보다 일반적으로 형식은

x ?=

여기서 ?는 일부 연산자(항상 +는 아님)를 의미하며, 특별한 조작 코드가 없을 수 있습니다.x가 복잡한 엔티티일 경우 컴파일러는 x에 접근할 때 중복을 피하도록 권장되며, 물론 x가 긴 이름일 경우 타이핑이 덜 필요할 수 있습니다.마지막으로 Burroughs B6700 시스템을 통해 제공되는 ALGOL 컴파일러의 유사한 기능의 기초가 되었습니다.실드 기호를 사용하여 할당된 변수를 나타냅니다.

긴 이름:=x + sqrt(LongName)*7;

될 것이다

긴 이름:=x + sqrt(~)*7;

기타 등등.이것은 단순한 것보다 더 일반적이다.x:=~ + 1;최적의 코드를 생성하는 것은 컴파일러의 영역입니다.

의미론

C와 같은 표현 지향 프로그래밍 언어에서 할당 및 증강 할당은 값을 갖는 표현식입니다.이를 통해 복잡한 표현에서 사용할 수 있습니다.그러나 이는 읽기 또는 이해하기 어려운 기호 시퀀스를 생성할 수 있으며, 더 나쁜 것은 잘못된 유형이 다른 횡설수설 시퀀스를 생성하기 쉽기 때문에 컴파일러에 의해 받아들여지지만 원하는 결과를 얻을 수 없다는 것입니다.Python과 같은 다른 언어에서 assignment와 argumented assignment는 표현식이 아닌 문장이기 때문에 복잡한 표현식에 사용할 수 없습니다.예를 들어, 다음은 유효한 C이지만 Python은 유효하지 않습니다.

a += b += c 

할당과 마찬가지로 이러한 언어에서 증강 할당은 권리 관련 할당의 한 형태입니다.

C와 달리 C++의 복합 할당식은 l [1]으로 평가됩니다.lvalue가 되면 다른 할당문 왼쪽에 [2]값을 쓸 수 있습니다.

인트 x = 11; (x *= 2) += 3; // x 를 25 로 설정합니다. 

계산된 할당 위치

C, C++ 및 Python과 같은 언어에서는 할당 위치에 함수 호출이 포함된 증강 할당은 함수를 한 번만 호출하도록 의무화됩니다.예: 성명서:

my_array[f1()] += 1 

함수f1한 번만 호출하도록 명령되어 있습니다.

언어가 매크로 확장을 통해 다음과 같은 추가 할당을 구현하는 경우:

my_array[f1()] = my_array[f1()] + 1 

그리고나서f1두 번 호출됩니다.

언어별

C의 자손

C, C++C#에서 할당 연산자는 =이며 다음과 같이 증가합니다.

교환입니다. 묘사
+= 추가
-= 뺄셈
*= 곱셈
/= 나누기
%= 계수
<<= 왼쪽 비트 시프트
>>= 오른쪽 비트 시프트
&= 비트 AND
^= 비트 배타적 논리합
= 비트 포함 OR

이들 각각을 해당 [1][3][4][5]언어에서 복합 할당 연산자라고 합니다.

지원 언어

다음 목록은 완전하지 않거나 모두 포함되지는 않지만 증강된 할당 연산자를 지원하는 주요 프로그래밍 언어 중 일부를 나열합니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ a b "Assignment Operators". cppreference.com. C++ Reference. Retrieved 1 March 2021.
  2. ^ Stroustrup, Bjarne (2013). The C++ Programming Language (Fourth ed.). Addison-Wesley. ISBN 978-0-321-56384-2.
  3. ^ "ISO/IEC 9899:201x Committee Draft April 12, 2011 N1570".
  4. ^ "Assignment and compound assignment operators".
  5. ^ "C# Language Specification". Microsoft. Retrieved 17 March 2014.