stringtranslate.com

Operadores de incremento y decremento

Los operadores de incremento y decremento son operadores unarios que aumentan o disminuyen su operando en uno.

Se encuentran comúnmente en lenguajes de programación imperativos . Los lenguajes como C presentan dos versiones (pre y post) de cada operador con semánticas ligeramente diferentes.

En los lenguajes derivados sintácticamente de B (incluido C y sus diversos derivados), el operador de incremento se escribe como ++y el operador de decremento como --. Varios otros lenguajes utilizan las 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 de puntero , y debe hacer referencia a un objeto de datos modificable . Los valores de los punteros se incrementan (o disminuyen) en una cantidad que los hace apuntar al siguiente (o anterior) elemento adyacente en la memoria.

En idiomas que admiten ambas versiones de los operadores:

En los idiomas donde incremento/decremento no es una expresión (por ejemplo, Go ), solo se necesita una versión (en el caso de Go, solo operadores posteriores).

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. Tales expresiones generalmente invocan un comportamiento indefinido y se deben evitar.

En lenguajes con punteros tipados como C, el operador de incremento hace que el puntero avance hasta el siguiente elemento de ese tipo, incrementando el valor del puntero en el tamaño de ese tipo. Cuando un puntero (del tipo correcto) apunta a cualquier elemento de una matriz, el incremento (o decremento) hace que el puntero apunte al elemento "siguiente" (o "anterior") de esa matriz. Por lo tanto, el incremento de un puntero a un entero hace que apunte al siguiente entero (normalmente incrementando el valor del puntero en 4); [1] el incremento de un puntero a una estructura de tamaño 106 bytes hace que apunte a la siguiente estructura incrementando el valor del puntero en 106. [2]

Ejemplos

El siguiente fragmento de código C ilustra la diferencia entre los operadores de incremento y decremento previos y posteriores :

entero x ; entero y ;  // Operadores de incremento // Pre-incremento: x se incrementa en 1, luego a y se le asigna el valor de x x = 1 ; y = ++ x ; // x ahora es 2, y también es 2     // Post-incremento: a 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 a y se le asigna el valor de x x = 1 ; y = -- x ; // x ahora es 0, y también es 0     // Post-decremento: a 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 idiomas que carecen de estos operadores, los resultados equivalentes requieren una línea de código adicional:

# 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 post-incremento se utiliza habitualmente 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 ;             mientras ( i < n ) suma += arr [ i ++ ]; // Incremento posterior de i, que recorre // n elementos de la matriz return suma ; }          

El operador post-incremento también se utiliza comúnmente con punteros :

// Copiar una matriz a otra void copy_array ( float * src , float * dst , int n ) { while ( n -- > 0 ) // Bucle que cuenta regresivamente desde n hasta cero * dst ++ = * src ++ ; // Copia el elemento *(src) a *(dst), // luego incrementa ambos punteros }                

Estos ejemplos también funcionan en otros lenguajes similares a C, como C++ , Java y C# .

Idiomas compatibles

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

Swift de Apple alguna vez admitió estos operadores, pero se dejaron de usar a partir de la versión 2.2 [13] y se eliminaron a partir de la versión 3.0. [14] [15]

Pascal , Delphi , Modula-2 y Oberon utilizan funciones ( inc(x)y dec(x)) en lugar de operadores.

Cabe destacar que 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 . [16]

Thompson fue un paso más allá al inventar los operadores ++ y --, que incrementan o decrementan; 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 a lo largo del camino. La gente suele suponer 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 convertirlos en prefijos y sufijos fue suya. De hecho, las celdas de incremento automático no se utilizaron 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.

Véase también

Referencias

  1. ^ Richard M Reese. "Comprensión y uso de punteros C". "Capítulo 4. Punteros y matrices". O'Reilly Media, Inc. 2013. ISBN  9781449344184
  2. ^ Richard Petersen. "Introducción a C con C++". 2019. Figura 12-12.
  3. ^ "Guía del usuario de GNU Awk". Free Software Foundation.
  4. ^ "8.3. La construcción de paréntesis dobles". El Proyecto de documentación de Linux.
  5. ^ Ritchie, Brian W. Kernighan; Dennis M.; Ritchie, Dennis (1988). El lenguaje de programación C (2. ed., [Siguiente] ed.). Englewood Cliffs, NJ: Prentice Hall. p. 18. ISBN 0-13-110362-8.{{cite book}}: CS1 maint: varios nombres: lista de autores ( enlace )
  6. ^ "Operadores de incremento/decremento". cppreference.com.
  7. ^ "Operador ++ (referencia de C#)". Red de desarrolladores de Microsoft.
  8. ^ "Sobrecarga del operador". dlang.org.
  9. ^ "Operadores de GP y sus prioridades".
  10. ^ "Acerca de los operadores de asignación".
  11. ^ "Incrementar el símbolo de Wolfram Language". Centro de documentación de Wolfram Language.
  12. ^ "Reducir el símbolo de Wolfram Language". Centro de documentación de Wolfram Language.
  13. ^ "Nuevas funciones de Swift 2.2". Sitio web oficial de Swift.
  14. ^ "¡Lanzamiento de Swift 3.0!". Sitio web oficial de Swift.
  15. ^ "Eliminar los operadores ++ y --". Evolución de Swift .
  16. ^ Ritchie, Dennis M. (marzo de 1993). "El desarrollo del lenguaje C". ACM SIGPLAN Notices . 28 (3): 5. doi : 10.1145/155360.155580 .