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 210Como 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:
Operador | Descripción | Precedencia | Asociatividad |
---|---|---|---|
[]
. () -> |
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 alta | de 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 | |
&& | AND | de izquierda a derecha | |
|| | OR | de izquierda a derecha | |
?: | if condicional | derecha a izquierda | |
= += -= *= /= %= &= ^= |= <<= >>= >>>= |
asignación
| derecha a izquierda | |
,
|
coma
| menor | derecha 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