jueves, 5 de noviembre de 2015

Asignación (=) VS. Comparación (==)

Un error típico es confundir la operación lógica de comparación IGUAL con la de asignación, lo peor de este error es que no se detecta en la compilación ni en la ejecución, sino que genera que el programa realice un flujo diferente al esperado.

La operación de asignación (=) cuando se realiza correctamente devuelve un 1 como resultado indicando que todo ha ido bien, por ejemplo:

int a; //definición de variable a de tipo int
if( a = 3) //si la operación de asignación se realiza correctamente realiza lo que está dentro del if
{
   ...
}

Podría ocurrir que por un error físico o lógico de memoria la operación a=3 se realice mal, en ese caso no se realizaría lo que está dentro del if.

Un ejemplo típico es utilizar variables para determinar el fin de una iteración, como ejemplo tenemos un programa que realiza una operativa siempre que el usuario pulse 1, cuando el usuario marca una tecla distinta termina la ejecución del programa. La estructura del algoritmo sería la siguiente:

int fin_ejecucion = 1; //variable que determina el fin de la ejecución del programa

while (fin_ejecucion == 1)
{
     //aquí realiza la función del programa
     //cuando termina la ejecución pregunta si quiere continuar
     write("Pulse 1 si desea continuar");
     read(fin_ejecucion); //lee del teclado lo que el usuario quiere
}

Si por error, cambiásemos la comparación por la asignación, la consecuencia sería que la operación fin_ejecucion = 1 siempre sería TRUE y por tanto nunca dejará de ejecutar el bucle.

Parece trivial, cuando en resolución de ejercicios (sobretodo los que se hacen en papel), se insiste mucho sobre este tema, pero es muy importante tenerlo en cuenta debido a que el compilador no lo puede detectar (no es un error de sintaxis) y tampoco lanza error en tiempo de ejecución, simplemente el programa hace algo que no le hemos pedido.

En otros lenguajes de programación como el PLSQL es más difícil caer en este error porque la instrucción de asignación se representa con := y la de comparación con =, por esto es importante conocer el set de instrucciones básicas (lógicas y aritméticas) antes de empezar a programar.





No hay comentarios:

Publicar un comentario