martes, 4 de junio de 2013

3. Orden de precedencia.

Precedencia de operadores

La interpretación de cualquier expresión en C++ está determinada por la precedencia y asociativo de los operadores en dicha expresión. Cada operador tiene una precedencia, y los operadores en una expresión se evalúan en orden de mayor a menor precedencia. La evaluación de operadores con la misma precedencia viene determinada por su asociativo  Y, al igual que en matemáticas, los paréntesis anulan las reglas de precedencia.
En la siguiente tabla se listan los operadores en C++, su precedencia y su asociativo  Los operadores se listan en orden de prioridad decreciente (los situados más arriba tienen mayor prioridad). Los operadores en la misma línea horizontal tienen la misma precedencia.

Operador
Propósito
Asociatividad
::
Scope (unario)
De derecha a izquierda
::
Scope (binario)
De izquierda a derecha
-> .
Selección de miembros
De izquierda a derecha
[]
Índices
De izquierda a derecha
()
Llamada a función
De izquierda a derecha
++
Postincremento
De izquierda a derecha
--
Postdecremento
De izquierda a derecha
sizeof
Tamaño de un objeto
De derecha a izquierda
++
Preincremento
De derecha a izquierda
--
Predecremento
De derecha a izquierda
* & + - ! ~
Operadores unarios
De derecha a izquierda
new
Crea un objeto
De derecha a izquierda
delete
Borra un objeto
De derecha a izquierda
()
Conversión de tipo (type cast)
De derecha a izquierda
->* .*
Puntero a un miembro
De izquierda a derecha
* / %
Operadores multiplicativos
De izquierda a derecha
+ -
Operadores aditivos
De izquierda a derecha
<< >>
Operadores bitwise
De izquierda a derecha
< > <= >=
Operadores de relación
De izquierda a derecha
== !=
Operadores de igualdad
De izquierda a derecha
&
Y bitwise
De izquierda a derecha
^
bitwise O exclusivo
De izquierda a derecha
|
bitwise O inclusivo
De izquierda a derecha
&&
Y lógico
De izquierda a derecha
||
O lógico
De izquierda a derecha
?:
Operador condicional
De derecha a izquierda
= *= /= += -= >*gt;=
&= ^= |= %= <<=
Operadores de asignación
De derecha a izquierda
,
Operador coma
De derecha a izquierda

En C++ las reglas de precedencia y asociatividad de operadores corresponden a las reglas matemáticas. Sin embargo, esto no funcionará, por ejemplo, con los operadores bitwise. Para tales operadores, se debe utilizar la tabla anterior, o bien paréntesis.

Orden de precedencia

  • La recomendación primera es utilizar paréntesis siempre que se considere oportuno.
  • En ausencia de ellos el orden de evaluación de los operadores es el siguiente:
operadores unarios
++, - -, !, - , +, casting
multiplicaciones y divisiones
*, /, %
sumas y restas
+, -
operadores relacionales
Descripción: $ < $, Descripción: $ > $, Descripción: $ <= $, Descripción: $ >= $
comparaciones de igualdad
==, !=
`` y `` lógico
&&
``o'' lógico
Descripción: $\vert\vert$
condicional ternario
?         :
asignaciones
=, +=, -=, *=, /=, %=
  • Se operan primero ( tienen mayor precedencia ) lo que se encuentran más arriba en la tabla.
  • El último en evaluarse es la asignación.

Precedencia de operadores

Cuando aparecen varias operaciones en una expresión, cada parte se evalúa y se resuelve en un orden determinado llamado prioridad de los operadores. Puede utilizar paréntesis para pasar por alto el orden de prioridad y obligar a evaluar algunas partes de una expresión antes que otras. Las operaciones entre paréntesis se realizan siempre antes que las de fuera. Sin embargo, entre paréntesis se mantiene el prioridad normal de los operadores.
Cuando las expresiones contienen operadores de más de una categoría, los operadores aritméticos se evalúan primero, los de comparación después y los lógicos los últimos. Todos los operadores de comparación tienen la misma prioridad, es decir, se evalúan en el orden de izquierda a derecha en el que aparecen. Los operadores aritméticos y lógicos se evalúan en el siguiente orden de prioridad:

Aritmético
Comparación
Lógico
Negación (-)
Igualdad (=)
Not
Exponenciación (^)
Desigualdad (<>)
And
Multiplicación y división (*, /)
Menor que (<)
Or
División de número entero (\)
Mayor que (>)
Xor
Modelo aritmético (Mod)
Menor o igual que (<=)
Eqv
Suma y resta (+, -)
Mayor o igual que (>=)
Imp
Concatenación de cadenas (&)
Is
&


Cuando aparecen la multiplicación y la división juntas en una expresión, se evalúa cada operación según aparece de izquierda a derecha. Asimismo, cuando aparecen la suma y la resta juntas en una expresión, cada operación se evalúa en orden de aparición de izquierda a derecha.
El operador de concatenación de cadena (&) no es un operador aritmético, pero por prioridad va después de todos los operadores aritméticos y antes de todos los operadores de comparación. El operador Is es un operador de comparación de referencias de objetos. No compara objetos ni sus valores; sólo comprueba para determinar si dos referencias de objetos hacen referencia al mismo objeto.

Las reglas de precedencia de las expresiones del lenguaje C nos dicen el orden en que el computador evalúa una expresión cuando hay más de un operador. Para expresiones aritméticas se siguen, lógicamente, las reglas de precedencia aritmética. Es decir, primero se aplica el operador de cambio de signo (-) , a continuación se calculan multiplicaciones y divisiones, y por último sumas y restas. Cuando hay dos operadores con la misma precedencia, se calcula primero la operación que está a la izquierda. Veamos algunos ejemplos:
IVA=PVP-PVP/1.16;
Tenemos una suma y una división. Siguiendo las reglas de precedencia aritmética, primero se calcula la división y después la suma. Si tenemos:
Z=-X+Z*2+N+Y/X-7;
El computador primero cambia de signo el valor de X. Después calcula la multiplicación (los operadores * y / tienen la misma precedencia, pero * está a la izquierda en esta expresión). Sigue con la división y por último hace las operaciones de suma y resta empezando por la izquierda de la expresión.
Se pueden utilizar paréntesis para cambiar la precedencia. Una expresión entre paréntesis tiene siguiente formato general:
(Expresión)
esto hace que el computador evalúe en primer lugar el contenido de los paréntesis. Los paréntesis se pueden anidar, esto es, se pueden colocar paréntesis dentro de expresiones entre paréntesis. En tal caso, se calcula en primer lugar el contenido de los paréntesis más internos. En
B=(K-Z*(n-1))*K;
El computador calcula primero la expresión n-1, sigue con el paréntesis más externo, y lo último que hace es multiplicar su contenido por K. Cuando tenemos varios paréntesis al mismo nivel de anidamiento, se evalúan empezando la izquierda. El computador calcula la expresión
Z=-(X+Z)*(2+N)+Y/(X-7);
Evaluando primero el contenido de los paréntesis antes de hacer las operaciones que hay fuera de ellos.
Esto es un resumen de la prioridad de las operaciones aritméticas, de mayor prioridad a menor prioridad:
1.     ()
2.     ! + - ++ -- (donde + y - son operadores unarios)
3.     * / %
4.     + - (donde + y - son operadores binarios)
5.     < <= > >= =< =>
6.     == !=
7.     &&

8.     ||

No hay comentarios:

Publicar un comentario