Buscar en Google

martes, 5 de abril de 2011

Incrementos y decrementos


Post-incrementos y post-decrementos


Volviendo al caso del contador, hay una forma aún más corta de escribirlo, y es la siguiente:

char A;

paso 1:   A = 1;

paso 2:   A++;

paso 3: Volver al paso 2

Vemos ahora que se ha cambiado la instrucción del paso 2 por A++. Esto significa que es equivalente hacer:

A = A + 1
A += 1
A++

A los fines prácticos. Es exactamente lo mismo elegir un caso u otro para nuestro programa. Sin embargo, el uso del operador post-incremento que es así como se llama cuando colocamos la instrucción A++ tiene otras ventajas.

La más visible de todas, es que en los microcontroladores existe normalmente una instrucción que se llama incremento. Por lo tanto, el hecho de colocar una línea tal como A++ significa para el microcontrolador una sola instrucción de código. Diferente es cuando se hace A+=1 o A = A +1. Ya que normalmente, el compilador toma el valor de A y le suma el valor 1. Para después copiar el resultado en la variable A.

Pero hay otra ventaja de utilizar post-incrementos. Podemos realizar en una misma línea algo como ésto:

B = 10 + A++;

¿Que es esto que les acabo de poner? A simple vista no hay ninguna ventaja, pero veamos lo que hace el compilador. Supongamos que la variable A cuando pasa el micro por la  línea que les acabo de mostrar, vale por ejemplo 10. Entonces, el compilador toma el valor de A y le suma 10. El resultado de la suma será 20 que será guardado en la variable B. Sin embargo, inmediatamente después de haber leído el compilador el valor de la variable A le hace un post-incremento. Esto es, al finalizar la ejecución de la línea, la variable A terminará con el valor 11.

Si nos gustan las cosas complicadas también podemos escribir algo totalmente válido en C:

B = 10 + A++ + A;

¿Se ve muy raro, no es cierto? Sin embargo no es inválido. El C lo permite. Analicemos que hace. Supongamos que de nuevo la variable A vale 10 al ingresar en la línea. Entonces el compilador resuelve el primer término de la suma, ésto es, en una variable temporal hará 10 + 10= 20. Pero inmediatamente de haber tomado el valor de la variable A por primera vez, la incrementa, por lo tanto cuando evalúa el segundo término, la variable A vale ahora 11. Entonces, la variable temporal que iba a obtener el resultado evaluará en un segundo paso: 20 + 11 = 31. O sea, la variable A fue modificada en el medio de la evaluación de la operación aritmética y a su vez el resultado dependió de esa modificación.





De la misma manera que hicimos A++, podemos hacer A--.

A = A - 1
A -= 1
A--

Donde ahora, si ponemos una línea de código que dice A-- significa que la variable A se debe decrementar en un valor. O lo que es lo mismo, restar 1 al valor de la variable A y almacenar el resultado en la misma variable. De igual manera que con el post-incremento, tiene las mismas características. Si bien, no todos los microcontroladores poseen una instrucción decremento, la mayoría si, por lo tanto para el compilador es una conversión directa entre la instrucción A--  y una instrucción de decremento.  También puede utilizase dentro de operaciones aritméticas, o dentro de otras instrucciones el operador post-decremento, que hará que se decremente el valor de la variable A ni bien se terminó de obtener el valor para evaluarlo en la fórmula o instrucción donde deba ser utilizado.

Pre-incrementos y pre-decrementos


De forma similar a las operaciones de post-incremento y/o post-decrementos, donde se incrementa o decrementa la variable afectada, después de haber evaluado el valor. Es posible indicarle al compilador, que primero incremente o decremente una variable cualquiera, y después tome el valor para procesar la operación donde está siendo afectada. Para indicar un pre-incremento o un pre-decremento, se anteponen dos signos ++ a la variable o dos signos -- para el caso de que sea una operación de decremento.

Si la operación consiste en implementar un simple contador, tal como lo hemos visto en el programa anterior, no hay diferencias entre elegir un pre-incremento o un post-incremento. Ya que el resultado será el mismo.

++A;
--A;

Sin embargo, si lo utilizamos dentro de una operación aritmética, o dentro de una función, la operación cambia. Veamos un ejemplo.

Supongamos que tenemos una operación en una línea de programa como la siguiente:

B = 10 + ++A;

Supongamos que la variable A vale inicialmente el valor 10. Entonces, el microcontrolador cuando llegue a ejecutar dicha línea, la primera tarea que realizará será el incremento de la variable A. En éste caso, como dijimos que valía 10, al incrementarla queda en 11. Entonces, luego para calcular el valor de la variable B, hace 10 + 11 = 21.

Notemos la diferencia cuando en vez de utilizar un pre-incremento, elegimos un post-incremento. Si la línea hubiese sido escrita de la siguiente manera:

B = 10 + A ++;

En éste caso, si la variable A originalmente hubiera tenido cargado el valor 10, el compilador evaluaría el valor de ésta como 10 para ejecutar la suma, por lo tanto B sería igual a 10 + 10, o sea 20. Y la variable A se incrementa inmediatamente después de haber sido evaluada. Terminando ésta en el valor 11. Para el caso del pre-incremento, la variable A también termina valiendo 11, pero en la fórmula entra el valor incrementado previamente a procesar la operación.