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 + 1
a 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.