Operadores incremento y decremento¶
Son operadores unarios, es decir, actúan sobre un único operando:
Operador |
Descripción |
|---|---|
|
operador preincremento, cuando precede al operando |
|
operador postincremento, cuando sucede al operando |
|
operador predecremento, cuando precede al operando |
|
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;(ox++;)
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;\(MOV \,\, R, A\): Mueve a \(A\) el contenido del registro \(R\).
\(ADD \,\, A, 1\): Suma
1(podría ser otro valor). Se ha evaluado la expresiónx + 1a la derecha del operador de asignación=.\(MOV \,\, A, R\): Mueve el resultado desde \(A\) a la posición \(R\). Es el efecto del operador
=.
x += 1;\(ADD \,\, R, 1\): Suma
1(podría ser otro valor) directamente al contenido del registro \(R\).
++x;\(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.