La asignación aumentada (o asignación compuesta ) es el nombre que se le da a ciertos operadores de asignación en ciertos lenguajes de programación (especialmente los derivados de C ). Una asignación aumentada se usa generalmente para reemplazar una declaración donde un operador toma una variable como uno de sus argumentos y luego asigna el resultado nuevamente a la misma variable. Un ejemplo simple es que se expande a . A menudo hay construcciones similares disponibles para varios operadores binarios.x += 1
x = x + 1
En general, en los lenguajes que ofrecen esta característica, la mayoría de los operadores que pueden tomar una variable como uno de sus argumentos y devolver un resultado del mismo tipo tienen un equivalente de asignación aumentada que asigna el resultado nuevamente a la variable en su lugar, incluidos los operadores aritméticos, los operadores de desplazamiento de bits y los operadores bit a bit .
Por ejemplo, la siguiente declaración o alguna variación de ella se puede encontrar en muchos programas:
x = x + 1
Esto significa "encontrar el número almacenado en la variable x , sumarle 1 y almacenar el resultado de la suma en la variable x ". Aunque parezca simple, puede tener una ineficiencia, ya que la ubicación de la variable x debe buscarse dos veces si el compilador no reconoce que dos partes de la expresión son idénticas: x puede ser una referencia a algún elemento de matriz u otra complejidad. En comparación, aquí está la versión de asignación aumentada:
x += 1
Con esta versión, no hay excusa para que un compilador no genere código que busque la ubicación de la variable x solo una vez y la modifique en el lugar, si, por supuesto, el código de máquina admite esa secuencia. Por ejemplo, si x es una variable simple, la secuencia del código de máquina podría ser algo como
Cargar x Agregar 1 Tienda x
y se generaría el mismo código para ambas formas. Pero si hay un código de operación especial, podría ser
MDMx,1
Significa "Modificar memoria" sumando 1 a x, y un compilador optimizador generaría el mismo código para ambas formas. Algunos códigos de máquina ofrecen operaciones INC y DEC (para sumar o restar uno), otros pueden permitir constantes distintas de una.
De manera más general, la forma es
x ? = expresión
donde el ? representa algún operador (no siempre + ), y puede que no haya códigos de operación especiales para ayudar. Aún existe la posibilidad de que si x es una entidad complicada, se aliente al compilador a evitar la duplicación al acceder a x y, por supuesto, si x es un nombre largo, se requerirá menos escritura. Esto último fue la base de la característica similar en los compiladores ALGOL ofrecidos a través de los sistemas Burroughs B6700 , que usaban el símbolo de tilde para representar la variable a la que se asignaba, de modo que
NombreLargo:=x + sqrt(NombreLargo)*7;
se convertiría en
NombreLargo:=x + sqrt(~)*7;
y así sucesivamente. Esto es más general que simplemente x:=~ + 1;
producir código óptimo seguiría siendo competencia del compilador.
En lenguajes de programación orientados a expresiones como C, la asignación y la asignación aumentada son expresiones que tienen un valor, lo que permite su uso en expresiones complejas. Sin embargo, esto puede producir secuencias de símbolos que son difíciles de leer o entender y, lo que es peor, un error tipográfico puede producir fácilmente una secuencia diferente de galimatías que, aunque sea aceptada por el compilador, no produzca los resultados deseados. En otros lenguajes, como Python, la asignación y la asignación aumentada son declaraciones, no expresiones, y, por lo tanto, no se pueden usar en expresiones complejas. Por ejemplo, lo siguiente es válido en C, pero no en Python:
a + = b + = c
Al igual que con la asignación, en estos idiomas la asignación aumentada es una forma de asignación asociativa por la derecha .
A diferencia de C, las expresiones de asignación compuestas de C++ evalúan un valor l . [1] Ser un valor l permite que se escriba en el lado izquierdo de alguna otra declaración de asignación: [2]
int x = 11 ; ( x *= 2 ) += 3 ; // Establece x en 25
En lenguajes como C, C++ y Python, una asignación aumentada en la que la ubicación de la asignación incluye llamadas a funciones, debe llamar a las funciones solo una vez. Es decir, en la declaración:
mi_matriz [ f1 ()] += 1
f1
Se exige que la función solo se llame una vez.
Si un lenguaje implementa la asignación aumentada mediante expansión de macros para:
mi_matriz [ f1 ()] = mi_matriz [ f1 ()] + 1
Luego f1
se llama dos veces.
En C , C++ y C# , el operador de asignación es =
, que se amplía de la siguiente manera:
Cada uno de ellos se denomina operador de asignación compuesto en dichos lenguajes. [1] [3] [4] [5]
La siguiente lista, aunque no es completa ni exhaustiva, enumera algunos de los principales lenguajes de programación que admiten operadores de asignación aumentada.