La precedencia de operadores determina como se agrupan los mismos, cuando aparecen distintos operadores cerca unos de otros en una expresión. Por ejemplo, ‘*’ tiene mayor precedencia que ‘+’; por lo que a +b * c significa que hay que multiplicar b * c y el resultado sumárselo a a.
Puedes saltarte la precedencia de operadores mediante los paréntesis. De hecho, es conveniente usar paréntesis donde quiera que tengas una combinación de operadores inusual, porque otras personas que lean el programa podrían no recordar cuál es la precedencia en ese caso. Tú mismo también podrías olvidarla; por lo que podrías cometer un fallo. Los paréntesis explícitos te prevendrán de tales errores.
Cuando se usan juntos operadores de igual precedencia, el operador más a la izquierda es el que tiene la precedencia, a excepción de la asignación, y operadores condicionales y exponenciales , los cuales se agrupan en el orden contrario. Por lo que, a - b + c se agrupa de la siguiente forma (a - b) + c; a = b = c se agrupa a = (b = c).
La precedencia de operadores unarios prefijo no importa ya que solo se ven implicados los operadores unarios, porque solo hay una forma de hacerles el parse – el más interno primero. Por lo que, $++i significa $(++i) y ++$x significa ++($x). Sin embargo, cuando otro operador sigue al operando, entonces la precedencia de los operadores unarios puede presentar problemas. Por lo que, $x**2 es lo mismo que ($x)**2, pero -x**2 significa -(x**2), porque `-' tiene menor precedencia que `**' mientras que `$' tiene una mayor precedencia.
Aquí tienes una lista de operadores de awk, en orden de precedencia creciente:
asignación | `=', `+=', `-=', `*=', `/=', `%=', `^=', `**=' Estos operadores se agrupan de derecha a izquierda. |
condicional | `?:' Estos operadores se agrupan de derecha a izquierda. |
“o” lógico. | `||' |
“y” lógico | `&&' |
Pertenencia a array | in |
Encaje o patrón | `~', `!~' |
Relacional y redireccionamiento | Los operadores relacionales y las redirecciones tienen el mismo nivel de precedencia. Caracteres tales como ‘>’ sirven tanto como relacionales como de redireccinamiento; el contexto hace que se diferencie entre los dos significados. Los operadores relacionales son `<', `<=', `==', `!=', `>=' y `>'. Los operadores de redireccionamiento de la Entrada/Salida son `<', `>', `>>' y `|'. Anotar que los operadores de redireccionamiento de la Entrada/Salida en las sentencias print y printf pertenecen al nivel de sentencia, no a las expresiones. El redireccionamiento no produce una expresión la cual podría ser el operando de otro operador. Como resultado de esto, no tendría sentido usar un operador de redirección cerca de otro operador de precedencia menor, sin paréntesis. Tales combinaciones, por ejemplo `print foo > a ? b : c', produce un error de sintaxis. |
Concatenación | No se usa ningún token especial para indicar la concatenación. Los operandos son escritos simplemente uno al lado de otro (con un espacio en medio de ambos). |
adición, sustración | `+', `-' |
Multiplicación, división y módulo | `*', `/', `%' |
Más y menos unario, "not" | `+', `-', `!' |
exponenciación | `^', `**' Estos operadores se agrupan de derecha a izquierda |
Incremento, decremento | `++', `--' |
Campo | `$' |
0 Comentarios