Incremento y operadores decremento son unarios operadores que se suman o se restan uno, hacia o desde su operando , respectivamente. Se implementan comúnmente en lenguajes de programación imperativos . Los lenguajes similares a C presentan dos versiones (pre y post) de cada operador con semántica ligeramente diferente.
En los lenguajes derivados sintácticamente de B (incluido C y sus diversas derivadas), el operador de incremento se escribe como ++
y el operador de decremento se escribe como --
. Varios otros lenguajes usan funciones inc (x) y dec (x).
El operador de incremento aumenta y el operador de decremento disminuye el valor de su operando en 1. El operando debe tener un tipo de datos aritmético o puntero y debe hacer referencia a un objeto de datos modificable . Los valores de los punteros aumentan (o disminuyen) en una cantidad que los hace apuntar al elemento siguiente (o anterior) adyacente en la memoria.
En idiomas que admiten ambas versiones de los operadores:
- El pre -increment y pre operadores de incremento -decrement (o decremento) de su operando por 1, y el valor de la expresión es el valor resultante incrementado (o disminuye).
- Los operadores post- incremento y post- decremento aumentan (o disminuyen) el valor de su operando en 1, pero el valor de la expresión es el valor del operando antes de la operación de incremento (o decremento).
En los lenguajes donde incrementar / decrementar no es una expresión (por ejemplo, Go ), solo se necesita una versión (en el caso de Go, solo los operadores de publicación).
Dado que el operador de incremento / decremento modifica su operando, el uso de dicho operando más de una vez dentro de la misma expresión puede producir resultados indefinidos. Por ejemplo, en expresiones como x - ++x
, no está claro en qué secuencia se deben realizar las operaciones de resta e incremento. Estas expresiones generalmente invocan un comportamiento indefinido y deben evitarse.
Ejemplos de
El siguiente fragmento de código C ilustra la diferencia entre los operadores de incremento y decremento pre y post :
int x ; int y ;// Operadores de incremento // Pre-incremento: x se incrementa en 1, luego y se asigna el valor de x x = 1 ; y = ++ x ; // x es ahora 2, y también es 2// Post-incremento: y se le asigna el valor de x, luego x se incrementa en 1 x = 1 ; y = x ++ ; // y es 1, x ahora es 2// Operadores de decremento // Pre-decremento: x se decrementa en 1, luego y se le asigna el valor de x x = 1 ; y = - x ; // x ahora es 0, y también es 0// Post-decremento: y se le asigna el valor de x, luego x se decrementa en 1 x = 1 ; y = x - ; // y es 1, x ahora es 0
En los lenguajes que carecen de estos operadores, los resultados equivalentes requieren una línea adicional de código:
# Preincremento: y = ++ x x = 1 x = x + 1 # x ahora es 2 (se puede escribir como "x + = 1" en Python) y = x # y también es 2# Post-incremento: y = x ++ x = 1 y = x # y es 1 x = x + 1 # x ahora es 2
El operador de postincremento se usa comúnmente con subíndices de matriz . Por ejemplo:
// Suma los elementos de una matriz float sum_elements ( float arr [], int n ) { float sum = 0.0 ; int i = 0 ; while ( i < n ) suma + = arr [ i ++ ]; // Incremento posterior de i, que pasa // a través de n elementos de la matriz devuelve suma ; }
El operador posterior al incremento también se usa comúnmente con punteros :
// Copia una matriz a otra void copy_array ( float * src , float * dst , int n ) { while ( n - > 0 ) // Bucle que cuenta hacia atrás de n a cero * dst ++ = * src ++ ; // Copia el elemento * (src) a * (dst), // luego incrementa ambos punteros }
Tenga en cuenta que estos ejemplos también funcionan en otros lenguajes similares a C, como C ++ , Java y C # .
- El operador de incremento se puede demostrar con un ejemplo:
#include
int main () { int c = 2 ; printf ( "% d \ n " , c ++ ); // esta declaración muestra 2, luego c se incrementa de 1 a 3. printf ( "% d" , ++ c ); // esta declaración incrementa c en 1, luego se muestra c. return 0 ; } - Producción:
24
- Producción:
Idiomas de apoyo
La siguiente lista, aunque no es completa ni exhaustiva, enumera algunos de los principales lenguajes de programación que admiten los operadores ++
/ --
increment / decrement.
|
|
|
( Swift de Apple una vez admitió estos operadores, [10] pero el soporte se eliminó a partir de la versión 3.)
Pascal , Delphi , Modula-2 y Oberon proporcionan las mismas funciones, pero se llaman inc (x) y dec (x).
En particular, Python y Rust no admiten estos operadores.
Historia
El concepto fue introducido en el lenguaje de programación B alrededor de 1969 por Ken Thompson . [11]
Thompson fue un paso más allá al inventar los operadores ++ y -, que aumentan o disminuyen; su posición de prefijo o sufijo determina si la alteración ocurre antes o después de anotar el valor del operando. No estaban en las primeras versiones de B, pero aparecieron en el camino. La gente suele adivinar que fueron creados para utilizar los modos de dirección de incremento y decremento automático proporcionados por el DEC PDP-11 en el que C y Unix se hicieron populares por primera vez. Esto es históricamente imposible, ya que no había PDP-11 cuando se desarrolló B. El PDP-7, sin embargo, tenía algunas celdas de memoria de 'incremento automático', con la propiedad de que una referencia de memoria indirecta a través de ellas incrementaba la celda. Esta característica probablemente sugirió tales operadores a Thompson; la generalización para hacerlos tanto prefijo como sufijo era suyo. De hecho, las celdas de autoincremento no se usaron directamente en la implementación de los operadores, y una motivación más fuerte para la innovación fue probablemente su observación de que la traducción de ++ x era menor que la de x = x + 1.
Ver también
- Asignación aumentada : para operadores
+=
y-=
- PDP-7
- PDP-11
- Función sucesora
Referencias
- ^ "Guía del usuario de GNU Awk" . Fundación de Software Libre.
- ^ "8.3. La construcción del doble paréntesis" . El proyecto de documentación de Linux.
- ^ Ritchie, Brian W. Kernighan; Dennis M .; Ritchie, Dennis (1988). El lenguaje de programación C (2. ed., [Nachdr.] Ed.). Englewood Cliffs, Nueva Jersey: Prentice Hall. pag. 18 . ISBN 0-13-110362-8.
- ^ "Operadores de incremento / decremento" . cppreference.com.
- ^ "++ Operador (Referencia de C #)" . Red de desarrolladores de Microsoft.
- ^ "Sobrecarga del operador" . dlang.org.
- ^ "Operadores GP y sus prioridades" .
- ^ "Acerca de los operadores de asignación" .
- ^ "Incremento del símbolo de Wolfram Language" . Centro de documentación de Wolfram Language.
- ^ "Operadores básicos" . developer.apple.com.
- ^ Ritchie, Dennis M. (marzo de 1993). "El desarrollo del lenguaje C" . Avisos ACM SIGPLAN . 28 (3): 5. doi : 10.1145 / 155360.155580 .