Compartir a través de


Prioridad y orden de evaluación

La prioridad y la asociatividad de los operadores de C afectan a la agrupación y la evaluación de operandos en expresiones.Una prioridad de operadores solo es significativa si otros operadores con una prioridad mayor o menor están presentes.Las expresiones que los operadores con mayor precedencia se evalúan primero.La prioridad también se puede describir por la palabra “que enlaza.” Indica los operadores con mayor precedencia para tener enlace más estricto.

La tabla siguiente se resume la prioridad y la asociatividad (el orden en que se evalúan los operandos) de los operadores de C, enumerandolos en orden de precedencia de mayor a menor.Donde varios operadores aparecen juntos, tienen prioridad igual y se evalúan según su asociatividad.Se describen los operadores en la tabla en las secciones a partir de Operadores postfijos.El resto de esta sección se proporciona información general sobre prioridad y asociatividad.

Prioridad y Asociatividad de los operadores de C

Symbol1

tipo de operación

Asociatividad

[ ] ( ) . – Sufijo++ de > y sufijo --

Expresión

De izquierda a derecha

prefijo++ y prefijo -- ¡sizeof y * + – ~!

Unario

De derecha a izquierda

typecasts

Unario

De derecha a izquierda

* / %

Multiplicativo

De izquierda a derecha

+ –

Sumatorio

De izquierda a derecha

<< >>

cambio bit a bit

De izquierda a derecha

< > <= >=

Relacional

De izquierda a derecha

== !=

Igualdad

De izquierda a derecha

&

Bit A bit

De izquierda a derecha

^

Bit a bit-exclusivo-O

De izquierda a derecha

|

Bit a bit-inclusivo-O

De izquierda a derecha

&&

AND lógico

De izquierda a derecha

||

OR lógico

De izquierda a derecha

?:

condicional

De derecha a izquierda

= *= /= %= 

+= – = <<= >>=&=

^= |=

assignment2 simple y compuesto

De derecha a izquierda

,

evaluación secuencial

De izquierda a derecha

1.Se enumeran los operadores en orden descendente de prioridad.Si varios operadores aparecen en la misma línea o en un grupo, tienen prioridad igual.

2.Todos los operadores simples y la compuesto-asignación tienen prioridad igual.

Una expresión puede contener varios operadores con prioridad igual.Cuando varios tales operadores aparecen en el mismo nivel en una expresión, la evaluación continúa según la asociatividad de operador, de derecha a izquierda y de izquierda a derecha.La dirección de la evaluación no afecta a los resultados de expresiones que incluyen más de una multiplicación (*), la suma (+), o binario-bit a bit (y | operador ^) en el mismo nivel.El orden de operaciones no lo define el lenguaje.El compilador es libre de evaluar estas expresiones en cualquier orden, si el compilador puede garantizar un resultado coherente.

¿Sólo la secuencial-evaluación (,), AND (&&), disyunción lógica (||), condicional (? :), y operadores de la llamada de función constituyen puntos de secuencia y por consiguiente garantiza un orden concreto de evaluación para sus operandos.El operador de llamada de función es el conjunto de paréntesis que siguen el identificador de función.Garantiza que el operador de la secuencial-evaluación (,) para evaluar los operandos de izquierda a derecha.(Observe que el operador de comas en una llamada de función no es igual que el operador de la secuencial-evaluación y no proporciona esta garantía.) Para obtener más información, vea puntos de secuencia.

Los operadores lógicos también garantiza la evaluación de sus operandos de izquierda a derecha.Sin embargo, se evalúa el número más pequeño de operandos necesarios para determinar el resultado de la expresión.Esto se denomina evaluación “cortocircuitada”.Por tanto, algunos operandos de expresiones no pueden ser evaluados.por ejemplo, en la expresión

x && y++

se evalúa el segundo operando, y++, sólo si x es true (cero).Así, y no se incrementa si x es false (0).

Ejemplos

La lista siguiente muestra cómo el compilador enlaza automáticamente varias expresiones de ejemplo:

Expresión

Enlace automático

a & b || c

(a & b) || c

a = b || c

a = (b || c)

q && r || s--

(q && r) || s––

En la primera expresión, el operador bit a bit (&) tiene prioridad sobre el operador lógico OR (||), a & b forma en el primer operando de la operación lógica OR.

En la segunda expresión, el operador lógico OR (||) tiene una prioridad sobre el operador de la simple-asignación (=), lo que b || c se agrupa como el operando derecho de la asignación.Observe que el valor asignado a a es 0 o 1.

La tercera expresión muestra una expresión correctamente formada que puede generar un resultado inesperado.El operador AND lógico (&&) tiene una prioridad sobre el operador lógico OR (||), lo que q && r se agrupa como operando.Puesto que los operadores lógicos garantiza la evaluación de operandos de izquierda a derecha, q && r se evalúa antes de s––.Sin embargo, si q && r se evalúa como un valor distinto de cero, s–– no se evalúa, y s no se reduzca.Si no s que disminuye provocaría un problema en el programa, s–– debe aparecer como el primer operando de expresiones, o s se debería disminuir en una operación independiente.

La siguiente expresión no es válida y muestra un mensaje de diagnóstico en tiempo de compilación:

expresión no válida

agrupación predeterminada

p == 0 ? p += 1: p += 2

( p == 0 ? p += 1 : p ) += 2

En esta expresión, el operador de igualdad (==) tiene la prioridad superior, por lo que p == 0 se agrupa como operando.El operador de expresión condicional (? :) tiene la prioridad NeXT-más alta.El primer operando es p == 0, y el segundo operando es p += 1.Sin embargo, el operador por el último operador de expresión condicional se considera p en lugar de p += 2, puesto que esta instancia de p enlaza más al operador de expresión condicional que hace que el operador de la compuesto-asignación.Un error de sintaxis se produce porque += 2 no tiene un operando izquierdo.Debe utilizar paréntesis para evitar errores de esta clase y código más legible de producción.Por ejemplo, podría utilizar paréntesis como se muestra a continuación para corregir y para clarificar el ejemplo anterior:

( p == 0 ) ? ( p += 1 ) : ( p += 2 )

Vea también

Referencia

Operadores de C