Está en la página 1de 6

Tabla de prioridades de operadores. Lo que sigue es la lista de operadores de C, ordenados segn su prioridad.

En caso de que una expresin contenga ms de un operador de igual prioridad, la evaluacin se realizar segn el orden que se indica en la columna central. Por ejemplo, si se encuentran dos operadores de desplazamiento (>> y <<), la evaluacin se har de izquierda a derecha. Pero si se encuentran dos operadores de suma con asignacin (+=), entonces la evaluacin se realizar de derecha a izquierda (se evala primero la expresin situada ms a la derecha).

Grupo de operadores () [] -> .

Orden de evaluacin

Comentarios

de izquierda Este es el grupo de operadores a derecha con mayor prioridad.

refundicin de tipos ! ~ ++ -- + - (tipo) * & de derecha La sizeof a izquierda y sizeof son operadores unarios. El smbolo "%" denota el operador de izquierda mdulo, que produce el resto a derecha entero obtenido al dividir el primer operando por el segundo. Los operadores aditivos tienen de izquierda menor prioridad que los a derecha multiplicativos. de izquierda Estos son los operadores a derecha desplazamiento bit a bit (q.v.) de izquierda a derecha de izquierda a derecha Este operador y los dos siguientes de izquierda realizan operaciones lgicas bit a a derecha bit, considerando bits individuales de sus operandos. de izquierda a derecha de izquierda de

*/%

+-

<< >> < <= > >= == !=

&

^ |

a derecha Este operador y el siguiente de izquierda producen resultados lgicos, pero a derecha no consideran bits individuales sino el valor global del operando. de izquierda a derecha de derecha a izquierda

&&

|| ?:

= += -= *= /= %= &= de derecha ^= |= <<= >>= a izquierda Este es el operador de menor prioridad en C. Sirve para separar una coleccin de expresiones, que se irn evaluando de izquierda a derecha. El resultado es el producido por la expresin situada de izquierda en ltimo lugar (ms a la derecha), y tiene por tanto el tipo a derecha y valor de esta ltima expresin. Se emplea a veces en expresiones de control; un ejemplo sera la clusula de iniciacin de un for o la clusula de mantenimiento de iteracin de un while.

Uso de parntesis. Cuando el compilador genera el cdigo que se emplea para evaluar una expresin, hace uso de la informacin textual de que dispone, pero no "reconoce" la expresin, como puede hacerlo un ser humano. Las unicas reglas que se aplican son las de prioridad de operadores expuestas en la tabla anterior. Sin embargo, C nos permite especificar sin ambigedad el orden de evaluacin deseado; esto se hace empleando parntesis. Los parntesis que estn anidados con ms profundidad sern los primeros en evaluarse. Vese un ejemplo. La idea es bien sencilla: el operador parntesis fuerza la evaluacin de su contenido, elevando su prioridad con respecto a todos los dems operadores, salvo el propio operador parntesis en el caso de que se encuentre ms profundamente anidado. Los parntesis no estropean nada,

y aseguran que el compilador entienda exactamente lo mismo que el programador. Cuando en una expresin aparecen dos o ms subexpresiones entre parntesis de igual prioridad, se realiza la evaluacin de izquierda a derecha. Vase unejemplo. Operador de asignacin: Distincin entre = y ==. Es muy frecuente cometer el error consistente en confundir dos operadores distintos pero de aspecto similar:

El operador de asignacin,

Y el operador de comparacin,

"=" "=="

Estos dos operadores, binarios ambos, admiten como operandos dos expresiones, y producen un resultado. Este resultado es completamente distinto:

El operador de asignacin, "=", produce como resultado el valor calculado para la expresin situada a su derecha. Por ejemplo, en valor de la expresin a = 7; es, precisamente, 7. Por su parte, el operador de comparacin, "==", produce como resultado un valor lgico (verdadero o falso) que es verdadero si los dos operandos tienen igual valor, y falso en caso contrario. Por ejemplo, a == 7; producir el valor lgico verdadero (un valor numrico no nulo) si el valor de a es precisamente siete, y el valor lgico falso (un cero) si el valor de a no es siete.

Como puede apreciarse, las expresiones a = 7; y a == 7; producen resultados completamente distintos... pero existe un grave peligro. En efecto, qu ocurre si se evala el resultado de estas expresiones desde el punto de vista lgico? Esto es, qu resultados obtendremos si se utiliza el resultado de estas expresiones como variable de control en una sentencia if(): if( a == 7) printf("a vale 7"); else printf("a no vale 7); if (a = 7) printf("a vale 7"); else printf("a no vale 7);

Como puede observarse, en la primera expresin el resultado ser siempre correcto: a == 7 solo es no nulo si a vale 7. Pero en la segunda, el resultado de evaluar a = 7 ser siempre 7. Luego pasan dos cosas:
a siempre recibir el valor 7, lo cual no se desea en absoluto y es un

error lgico Adems, siempre se imprimir en pantalla "a vale 7", que puede no ser cierto; esto ocurre porque 7 es no nulo y por tanto se toma como un valor lgico verdadero.

Como decamos, esta es una fuente de errores muy comn. El compilador no puede detectarlos, porque tanto a = 7 como a == 7 son expresiones completamente correctas. Afortunadamente, basta invertir el orden de la expresin para que el compilador detecte un error: if( 7 == a) printf("a vale 7"); else printf("a no vale 7); if (7 = a) printf("a vale 7"); else printf("a no vale 7); La expresin 7 == a es vlida; se tienen dos operandos para el operador de comparacin. Pero la expresin 7 = a es sintcticamente incorrecta, porque 7 no es un nombre vlido de variable. El compilador seala un error. Por tanto, para evitar este tipo de errores, debemos adoptar la costumbre de situar siempre las constantes a la izquierda cuando se utilice el operador "==". De este modo, si olvidamos un "=", el compilador detecta el error. Asignaciones mltiples Como se ha indicado, el resultado de una asignacin es el valor de la expresin situada a la derecha. Esto permite escribir expresiones de la forma a = b = c; en donde primero se evala c; a continuacin se asigna c a b, y por ltimo se asigna b a a. Vase el oportuno Ejemplo. Ejercicio.- Verificar las reglas de prioridad de operadores, empleando parntesis para efectuar un clculo elemental. Comprobar los resultados obtenidos tanto al emplear parntesis como al no hacer uso de ellos.

#include <stdio.h> void main(void) { int cociente, a, b, c, d; printf ("Parntesis y prioridad de operadores\n\n"); cociente = 0; a = 10; b = 4; c = 5; d = 1; cociente = (a*b)/(c+d); printf("Empleando parntesis,cociente vale %d\n",cociente); cociente = 0; a = 10; b = 4; c = 5; d = 1; cociente = a*b/c+d; printf("Sin emplear parntesis,cociente vale %d\n",cociente); } /* Resultados: Parntesis y prioridad de operadores Empleando parntesis,cociente vale 6 Sin emplear parntesis,cociente vale 9 */ Comentario.- El primer caso no tiene dificultad; los parntesis hacen de igual prioridad los dos lados del rvalue y se evala la expresin de izquierda a derecha (vase el siguiente ejercicio). En el segundo caso, el operador de multiplicacin y el de divisin tienen igual prioridad, y el operador suma tiene menor prioridad que los anteriores. Por tanto, se evalan primero las subexpresiones relativas a operadores de mayor prioridad. Dado que la prioridad de * y / es la misma, se evala de izquierda a derecha, luego se calculaa*b. Acto seguido se divide el resultado por c. Por ltimo, a*b/c se suma con d. Ejercicio.- Estudiar la evaluacin de expresiones a igualdad de prioridades, en el caso de parntesis. Comprobar que la evaluacin se efecta de izquierda a derecha. #include <stdio.h> void main(void) { int num, cociente, a, b, c, d; printf ("Evaluacin de expresiones\n\n"); a = 10; b = 4; c = 5; d = 1; num = 0; cociente = (num = a*b)/(num + c + d); printf("Cociente vale %d\n", cociente);

printf("\n\nTerminacin normal del programa.\n"); } /* Salida obtenida: Evaluacin de expresiones Cociente vale 0 Terminacin normal del programa. */ Comentario.- El resultado es 0, luego se evala de izquierda a derecha. Si fuera de derecha a izquierda,el denominador hara uso del valor nulo de num, y el resultado no sera cero sino 6. Ejemplo.- Comprobar los resultados de una confusin entre el operador "=" y el operador "==". #include <stdio.h> void main(void) { int a, b, c; printf ("Confusin del operador = con el operador ==\n\n"); a = 1; b = 2; c = 3; a = b == c; printf("El resultado de comparar b = %d y c = %d es a = %d\n\n", b, c, a); a = b = c; printf("El resultado de ASIGNAR c = %d a b = %d a a es a = %d\n\n", c, b, a); printf("\n\nTerminacin normal del programa.\n\n"); } /* Confusin del operador = con el operador == El resultado de comparar b = 2 y c = 3 es a = 0 El resultado de ASIGNAR c = 3 a b = 3 a a es a = 3 Terminacin normal del programa. */ Comentarios.- Obsrvese que 0 denota falso, y 3 denota verdadero. Por tanto, la asignacin dara lugar a un valor incorrecto para a, que no sera detectado.

También podría gustarte