Precedencia de los operadores en C
Contenidos
Esta sección cubre las comparaciones lógicas básicas y muestra cómo se pueden hacer en R base frente al uso del paquete extraoperators. Muchas de ellas son bastante simples, pero están definidas para que sean posibles los operadores posteriores.
Hasta ahora no hay ninguna ganancia real en el uso de extraoperadores, pero esto cambia para operaciones más complejas. ¿Qué pasa si queremos saber si nuestros valores están dentro de algún rango? Esta es una tarea bastante común, como decir que las edades válidas deben estar entre 0 y 100 años.
Otra tarea bastante común es seleccionar sólo determinadas observaciones. Por ejemplo, podríamos querer calcular la media de los números dentro de un rango plausible (por ejemplo, excluyendo los valores atípicos). En los extraoperadores, el subconjunto se realiza añadiendo un prefijo s.
En el lenguaje, es bastante natural hacer una afirmación como ésta «En mi estudio, la edad debe estar entre 18 y 65 años y no debe faltar». En R, la implementación habitual de esto es más equivalente a: «En mi estudio, la edad debe ser mayor de 18 y la edad debe ser menor de 65 y la edad no debe faltar». extraoperators intenta facilitar algo más cercano a la declaración original más limpia utilizando el operador de encadenamiento, %c%. El operador de encadenamiento encadena un conjunto de operaciones en el lado derecho con el argumento en su lado izquierdo pasado a cada uno. Para lograr esto, el lado derecho debe ser citado.
Operadores relacionales
Esto garantiza la búsqueda de la mejor respuesta. Sin embargo, repetirá muchas operaciones una y otra vez. Se puede ahorrar algo de tiempo evitando la repetición de cálculos, lo que se puede conseguir utilizando una caché de «cómo se evalúa esta subexpresión». Al incluir la caché, se entra en el terreno de la «programación dinámica» (= reutilización de resultados anteriores en cálculos posteriores).
Si el valor objetivo es t, y hay n operaciones en la lista, y el mayor valor absoluto que se puede crear combinando alguna subsecuencia de ellas es k, y el valor absoluto del producto de todos los valores que aparecen como operando de una operación de división es d, entonces hay un simple algoritmo de programación dinámica de tiempo y espacio O(dkn) que determina si es posible calcular el valor i usando algún subconjunto de las primeras j operaciones y almacena esta respuesta (un solo bit) en dp[i][j]:
donde invOp(i, j) calcula la inversa de la jésima operación sobre el valor i. Observe que si la jésima operación es una multiplicación por, digamos, x, e i no es divisible por x, entonces se considera que la operación no tiene inversa, y se considera que el término dp[invOp(i, j)][j-1] se evalúa como falso. Todas las demás operaciones tienen inversos únicos.
Operador Js
Si se producen varias operaciones en una expresión, cada parte se evalúa y se resuelve en un orden predeterminado llamado Precedencia del Operador. Los paréntesis pueden utilizarse para anular el orden de precedencia y evaluar algunas partes de una expresión antes que otras. Las operaciones dentro de los paréntesis siempre se realizan antes que las que están fuera. Sin embargo, dentro de los paréntesis se mantiene la precedencia normal de los operadores.
Si las expresiones contienen operadores de más de una categoría, los operadores aritméticos se evalúan primero, los operadores de comparación después y los operadores lógicos por último. Todos los operadores de comparación tienen la misma precedencia; 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 precedencia:
El operador de concatenación de cadenas (&) no es un operador aritmético, pero en la precedencia, sí cae 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 referencia de objetos. No compara objetos ni sus valores; sólo comprueba si dos referencias de objeto se refieren al mismo objeto.
Operadores de comparación
Desde el punto de vista de un matemático, la abundancia de pluses puede parecer extraña. Pero desde el punto de vista de un programador, no hay nada especial: los pluses unarios se aplican primero, convierten las cadenas en números y luego el plus binario los suma.
Desde la escuela, todos sabemos que la multiplicación en la expresión 1 + 2 * 2 debe calcularse antes de la suma. Eso es exactamente lo de la precedencia. Se dice que la multiplicación tiene mayor precedencia que la suma.
Como podemos ver, el «plus unario» tiene una prioridad de 15 que es mayor que el 12 de la «adición» (plus binario). Por eso, en la expresión «+manzanas + +naranjas», los pluses unarios funcionan antes que la adición.
Las asignaciones encadenadas se evalúan de derecha a izquierda. Primero se evalúa la expresión 2 + 2 de la derecha y luego se asigna a las variables de la izquierda: c, b y a. Al final, todas las variables comparten un único valor.
Aclaremos. Como sabemos, todos los operadores devuelven un valor. El incremento/decremento no es una excepción. La forma prefija devuelve el nuevo valor, mientras que la forma postfija devuelve el valor antiguo (antes del incremento/decremento).