viernes, 9 de noviembre de 2012

Precedencia en Objective-C

Cuando los seres humanos evaluamos expresiones, por lo general lo hacemos de la izquierda hacia la derecha. Por ejemplo, trabajando de izquierda a derecha se obtiene un resultado de 300 a partir de la siguiente expresión:
 
10 + 20 * 10 = 300

Esto se debe a que nosotros, como seres humanos, sumamos 10 a 20, dando  30 y luego multiplicar por 10 para llegar a 300. Si Objective-C realizara el mismo cálculo y se obtiene un resultado muy diferente:

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{
        NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

        int x = 10 + 20 * 10;

        NSLog(@"El resultado es %i", x);
        [pool drain];
        return 0;
}
Cuando se ejecuta, el resultado del cálculo se asigna a la variable x enteros y, posteriormente, se muestra utilizando la llamada NSLog:
El resultado es 210
Como podemos ver en la salida anterior, Objective-C considera que la respuesta es 210.
Este es un resultado directo de la prioridad de los operadores. Objective-C tiene un conjunto de reglas que le indican el orden en el que los operadores deben ser evaluados en una expresión.

Objective-C considera el operador de multiplicación (*) tiene una mayor precedencia que la suma (+).

Al abordar la cuestión de la precedencia de los operadores en algunos lenguajes de scripting y programación, lo único que se requiere es generalmente una tabla con los operadores en orden de prioridad de mayor a menor. 
Objective-C tiene más en común con lenguajes como Java y C # en que los operadores estén agrupados en diferentes niveles de precedencia.  
Cuando los operadores del mismo nivel de prioridad se encuentran dentro del contexto de una sola expresión, se sigue una regla en cuanto al orden en el que los operadores han de evaluarse. 
Esta regla se conoce como la asociatividad y difiere de un grupo a otro.  
En la tabla siguiente se describen los grupos de operadores de precedencia y asociatividad correspondiente para Objective-C:

Como podemos ver en la tabla, cuando los operadores del mismo nivel de precedencia aparezcan en una expresión, los operadores se evalúan ya sea de izquierda a derecha o de derecha a izquierda según la asociatividad de ese grupo.  

Por ejemplo, la siguiente expresión se evalúan de izquierda a derecha, debido tanto a los operadores están en el mismo nivel de prioridad y esta es la regla dictados por la asociatividad correspondiente:
 
OperadorDescripciónPrecedenciaAsociatividad
[]
.
()
->
acceso a un elemento array o a una expresión
acceso a un método o propiedad
invoca a un método o propiedad
aputador aun miembro de una estructura
La más altade izquierda a derecha
++
--
+
-
!
~
*
&
sizeof
(type)
incremento
decremento
unary plus
negativo
NOT lógico
complemento
apuntador
dirección
tamaño del objeto
cambio de tipo (cast)
derecha a izquierda
*
/
%
multiplicación
división
módulo
de izquierda a derecha
+
-
suma
resta
de izquierda a derecha




<=
>=
>
menor o igual
mayor o igual
mayor que
de izquierda a derecha
==
!=
igualdad
de izquierda a derecha












&&ANDde izquierda a derecha
||ORde izquierda a derecha
?:if condicionalderecha a izquierda
  =   +=   -=
 *=   /=   %=
 &=   ^=   |=
<<=  >>= >>>=
asignación
derecha a izquierda
,
coma
menorderecha a izquierda
int x = 10 * 20 / 5;

Modificar la precedencia

Las reglas de precedencia y asociatividad integrados en Objective-C puede ser modificados por los paréntesis. Por ejemplo, se puede anular la precedencia y forzar a la izquierda a la derecha evaluación de nuestro ejemplo original de la siguiente manera:
int x = (10 + 20) * 10;

NSLog(@"El resultado es   %i", x);

En el ejemplo anterior, el fragmento de expresión entre paréntesis se evalúan antes de la más alta prioridad multiplicación resulta en la expresión equivalente a 300 en lugar de 210 , cuando no modificamos la precedencia original de Objective-C:
El resultado es 300




No hay comentarios:

Publicar un comentario