Operadores incremento y decremento

Son operadores unarios, es decir, actúan sobre un único operando:

Operadores incremento y decremento

Operador

Descripción

++x

operador preincremento, cuando precede al operando

x++

operador postincremento, cuando sucede al operando

--x

operador predecremento, cuando precede al operando

x--

operador postdecremento, cuando sucede al operando

Pueden preceder o suceder a su operando:

Si el operador antecede al operando, C++ utiliza el valor ya incrementado o decrementado.

Por ejemplo:

int x = 10;
int y = ++x;

pone y a 11.

Sin embargo, si se escribe el código como:

int x = 10;
int y = x++;

entonces y toma el valor 10. En ambos casos x queda con valor 11. La diferencia estriba en cuando cambia el valor.

Ejemplo

#include <iostream>

int main()
{
   int x = 1;
   int y = ++x;
   int z = x++;
   std::cout << "x = " << x << '\n'
             << "y = " << y << '\n'
             << "z = " << z << '\n';
}

Edita, compila y ejecuta el código

En este curso, estos operadores los usaremos en exclusiva sobre variables de tipo aritméticos.

Advertencia

Estos operadores no pueden utilizarse sobre un valor por la derecha.

x = (z+3)++;  //¡ERROR!

Opciones para incrementar/decrementar en una unidad

Para añadir 1 al valor de una variable aritmética tenemos 3 posibilidades:

  • x = x + 1;

  • x += 1;

  • ++x; (o x++;)

Analicemos qué instrucciones deben realizarse en la CPU para cada una de ellas.

Supongamos que la variable x se encuentra almacenada en un registro \(R\) de la CPU y sea \(A\) otro registro de la CPU, típicamente conocido como acumulador, donde ésta guarda el resultado de una operación.

  • x = x + 1;

    1. \(MOV \,\, R, A\): Mueve a \(A\) el contenido del registro \(R\).

    2. \(ADD \,\, A, 1\): Suma 1 (podría ser otro valor). Se ha evaluado la expresión x + 1 a la derecha del operador de asignación =.

    3. \(MOV \,\, A, R\): Mueve el resultado desde \(A\) a la posición \(R\). Es el efecto del operador =.

  • x += 1;

    1. \(ADD \,\, R, 1\): Suma 1 (podría ser otro valor) directamente al contenido del registro \(R\).

  • ++x;

    1. \(INC \,\, R\): No realiza una suma a nivel hardware. Un circuito especial de la ALU permite incrementar (o decrementar) una variable en una unidad de forma más rápida.

Nota

Los compiladores modernos pueden optimizar nuestro código y transformar la sentencia x = x + 1; a, por ejemplo, ++x; de forma transparente al usuario.

Nota

Cuando se pueda usar indistintamente ++x o x++ es más eficiente ++x dado que con x++ se tiene que guardar el valor incrementado de la variable x, que es un valor por la derecha, hasta la siguiente sentencia.