+=
), entonces la evaluación se realizará de derecha a izquierda (se evalúa primero la expresión situada más a la derecha).
Grupo de operadores | Orden de evaluación | Comentarios |
---|---|---|
() [] -> . | de izquierda a derecha | Este es el grupo de operadores con mayor prioridad. |
! ~ ++ -- + - (tipo) * & sizeof | de derecha a izquierda |
La refundición de tipos y
sizeof
son operadores unarios.
|
* / % | de izquierda a derecha | El símbolo "%" denota el operador módulo, que produce el resto entero obtenido al dividir el primer operando por el segundo. |
+ - | de izquierda a derecha | Los operadores aditivos tienen menor prioridad que los multiplicativos. |
<< >> | de izquierda a derecha | Estos son los operadores de desplazamiento bit a bit (q.v.) |
< <= > >= | de izquierda a derecha | |
== != | de izquierda a derecha | |
& | de izquierda a derecha | Este operador y los dos siguientes realizan operaciones lógicas bit a bit, considerando bits individuales de sus operandos. |
^ | de izquierda a derecha | |
| | de izquierda a derecha | |
&& | de izquierda a derecha | Este operador y el siguiente producen resultados lógicos, pero no consideran bits individuales sino el valor global del operando. |
|| | de izquierda a derecha | |
?: | de derecha a izquierda | |
= += -= *= /= %= &= ^= |= <<= >>= | de derecha a izquierda | |
, | de izquierda a derecha |
Este es el operador de menor prioridad en C. Sirve para separar una colección de expresiones, que se irán evaluando de izquierda a derecha. El resultado es el producido por la expresión situada en último lugar (más a la derecha), y tiene por tanto el tipo y valor de esta última expresión. Se emplea a veces en expresiones de control; un ejemplo sería la cláusula de iniciación de un
for
o la cláusula de mantenimiento de iteración de un
while .
|
a = 7;
es, precisamente, 7.a == 7
; producirá el valor lógico verdadero (un valor numérico no nulo) si el valor de a es precisamente siete, y el valor lógico falso (un cero) si el valor de a no es siete.a = 7
; y a == 7
; producen resultados completamente distintos... pero existe un grave peligro. En efecto, ¿qué ocurre si se evalúa el resultado de estas expresiones desde el punto de vista lógico? 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);
a
siempre recibirá el valor 7, lo cual no se desea en absoluto y es un error lógicoa vale 7
", que puede no ser cierto; esto ocurre porque 7 es no nulo y por tanto se toma como un valor lógico verdadero.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);
a = b = c;en donde primero se evalúa
c
; a continuación se asigna
c
a
b
, y por último se asigna
b
a
a
. Véase el oportuno
Ejemplo.#include <stdio.h> void main(void) { int cociente, a, b, c, d; printf ("Paréntesis y prioridad de operadores\n\n"); cociente = 0; a = 10; b = 4; c = 5; d = 1; cociente = (a*b)/(c+d); printf("Empleando paréntesis,cociente vale %d\n",cociente); cociente = 0; a = 10; b = 4; c = 5; d = 1; cociente = a*b/c+d; printf("Sin emplear paréntesis,cociente vale %d\n",cociente); } /* Resultados: Paréntesis y prioridad de operadores Empleando paréntesis,cociente vale 6 Sin emplear paréntesis,cociente vale 9 */Comentario.- El primer caso no tiene dificultad; los paréntesis hacen de igual prioridad los dos lados del rvalue y se evalúa la expresión de izquierda a derecha (véase el siguiente ejercicio). En el segundo caso, el operador de multiplicación y el de división tienen igual prioridad, y el operador suma tiene menor prioridad que los anteriores. Por tanto, se evalúan primero las subexpresiones relativas a operadores de mayor prioridad. Dado que la prioridad de
*
y
/
es la misma, se evalúa 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
.
#include <stdio.h> void main(void) { int num, cociente, a, b, c, d; printf ("Evaluación 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\nTerminación normal del programa.\n"); } /* Salida obtenida: Evaluación de expresiones Cociente vale 0 Terminación normal del programa. */Comentario.- El resultado es 0, luego se evalúa de izquierda a derecha. Si fuera de derecha a izquierda,el denominador haría uso del valor nulo de
num
, y el resultado no sería cero sino 6.
#include <stdio.h> void main(void) { int a, b, c; printf ("Confusión 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\nTerminación normal del programa.\n\n"); } /* Confusión 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 Terminación normal del programa. */Comentarios.- Obsérvese que 0 denota falso, y 3 denota verdadero. Por tanto, la asignación daría lugar a un valor incorrecto para
a
, que no sería detectado.