Articulo de referencia

Tarea ampliada

La asignación aumentada (o asignación compuesta ) es el nombre que reciben ciertos operadores de asignación en algunos lenguajes de programación (especialmente en aquellos deriv...

La asignación aumentada (o asignación compuesta ) es el nombre que reciben ciertos operadores de asignación en algunos lenguajes de programación (especialmente en aquellos derivados de C ). Generalmente, se utiliza para reemplazar una instrucción en la que un operador toma una variable como argumento y luego asigna el resultado a la misma variable. Un ejemplo sencillo es , que se expande a . Existen construcciones similares para diversos operadores binarios.x += 1x = 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 de vuelta a la variable en el mismo lugar, incluidos los operadores aritméticos, los operadores de desplazamiento de bits y los operadores bit a bit .

Discusión

Por ejemplo, la siguiente instrucción o alguna variación de la misma 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 sencillo, puede resultar ineficiente, ya que la ubicación de la variable x debe consultarse dos veces si el compilador no reconoce que dos partes de la expresión son idénticas: x podría ser una referencia a algún elemento de un array 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 una sola vez y la modifique allí mismo, si por supuesto el código máquina admite dicha secuencia. Por ejemplo, si x es una variable simple, la secuencia de código máquina podría ser algo como

Cargar x Agregar 1 Tienda x

y se generaría el mismo código para ambos formularios. Pero si hay un código de operación especial, podría ser

MDM x,1

significa "Modificar la memoria" sumando 1 a x, y un compilador optimizador generaría el mismo código para ambas formas. Algunos códigos máquina ofrecen operaciones INC y DEC (para sumar o restar uno), otros podrían permitir constantes distintas de uno.

En términos más generales, la forma es

x ? = expresión

donde el signo de interrogación representa algún operador (no siempre + ), y puede que no haya códigos de operación especiales que ayuden. Todavía existe la posibilidad de que si x es una entidad compleja, el compilador se vea alentado 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 utiliza el símbolo de tilde para representar la variable a la que se asigna, de modo que

LongName := x + sqrt ( LongName ) * 7 ;

se convertiría en

LongName := 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.

Semántica

En lenguajes de programación orientados a expresiones como C, la asignación y la asignación aumentada son expresiones que poseen un valor. Esto permite su uso en expresiones complejas. Sin embargo, esto puede generar secuencias de símbolos difíciles de leer o comprender, y peor aún, un error tipográfico puede producir fácilmente una secuencia de caracteres sin sentido que, si bien es aceptada por el compilador, no produce los resultados deseados. En otros lenguajes, como Python, la asignación y la asignación aumentada son sentencias, no expresiones, y por lo tanto no pueden utilizarse en expresiones complejas. Por ejemplo, lo siguiente es código C válido, pero no Python válido:

a += b += c

Al igual que con la asignación, en estos idiomas la asignación aumentada es una forma de asignación asociativa derecha .

A diferencia de C, las expresiones de asignación compuestas de C++ se evalúan a un lvalue . [ 1 ] Ser un lvalue permite escribirlo en el lado izquierdo de alguna otra instrucción de asignación: [ 2 ]

int x = 11 ; ( x *= 2 ) += 3 ; // Establece x en 25

Ubicaciones de asignación calculadas

En lenguajes como C, C++ y Python, una asignación aumentada, donde la ubicación de la asignación incluye llamadas a funciones, está obligada a llamar a las funciones solo una vez. Es decir, en la instrucción:

mi_array [ f1 ()] += 1

Esta función solo f1debe llamarse una vez.

Si un lenguaje implementa la asignación aumentada mediante la expansión de macros a:

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

Luego f1se llama dos veces.

Por idioma

descendientes de C

En C , C++ y C# , el operador de asignación es =, que se amplía de la siguiente manera:

Cada uno de estos se denomina operador de asignación compuesta en dichos lenguajes. [ 1 ] [ 3 ] [ 4 ] [ 5 ]

Idiomas compatibles

La siguiente lista, aunque no es exhaustiva ni completa, enumera algunos de los principales lenguajes de programación que admiten operadores de asignación aumentada.

Véase también

Referencias

  1. 1 2 "Operadores de asignación" . cppreference.com . Referencia de C++ . Consultado el 1 de marzo de 2021 .
  2. Stroustrup, Bjarne (2013). El lenguaje de programación C++ (Cuarta ed.). Addison-Wesley. ISBN  978-0-321-56384-2.
  3. "ISO/IEC 9899:201x Borrador del Comité 12 de abril de 2011 N1570" .
  4. "Operadores de asignación y asignación compuesta" .
  5. "Especificación del lenguaje C#" . Microsoft . Consultado el 17 de marzo de 2014 .