Beruflich Dokumente
Kultur Dokumente
Smbol
Nombre Comentarios
o
PRIORIDADES DE OPERADORES.
Orden de
Grupo de operadores Comentarios
evaluacin
de izquierda Este es el grupo de operadores con mayor
() [] -> .
a derecha prioridad.
! ~ ++ -- + - (tipo) * & de derecha a La refundicin de tipos y sizeof son operadores
sizeof izquierda unarios.
El smbolo "%" denota el operador mdulo, que
de izquierda
*/% produce el resto entero obtenido al dividir el
a derecha
primer operando por el segundo.
de izquierda Los operadores aditivos tienen menor prioridad
+-
a derecha que los multiplicativos.
de izquierda Estos son los operadores de desplazamiento bit a
<< >>
a derecha bit (q.v.)
de izquierda
< <= > >=
a derecha
de izquierda
== !=
a derecha
Este operador y los dos siguientes realizan
de izquierda
& operaciones lgicas bit a bit, considerando bits
a derecha
individuales de sus operandos.
de izquierda
^
a derecha
de izquierda
|
a derecha
Este operador y el siguiente producen resultados
de izquierda
&& lgicos, pero no consideran bits individuales sino
a derecha
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
,
a derecha tanto el tipo 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.
if (a = 7)
printf("a vale 7");
else
printf("a no vale 7);
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);
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.
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:
*/
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 calcula a*b.
Acto seguido se divide el resultado por c. Por ltimo, a*b/c se suma con d.
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.
*/
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
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.