Руководство пользователя для GNU Awk
7. Выражения
7.14 Приоритет операторов (Как операторы "гнездятся")
Приоритет операторов определяет их группировку, когда они входят в состав одного выражения. Например, `*' имеет более высокий приоритет чем `+'; так, `a + b * c' означает перемножить b и c и затем добавить a к произведению (i.e. `a + (b * c)').
Можно преодолеть приоритет операторов употреблением скобок. Можно трактовать правила приоритета как подразумеваемую расстановку скобок. Рекомендуется всегда употреблять скобки при необычной комбинации операторов для облегчения ее чтения другими людьми или вами самими. Явное употребление скобок помогает предотвращать многие ошибки.
Когда употребляются вместе операторы одного приоритета, сначала заключается в скобки самый левый оператор, исключая присваивания, условные операторы и возведение в степень, которые группируются в обратном порядке. Так, `a - b + c' группируется как `(a - b) + c', а `a = b = c' группируется как `a = (b = c)'. Приоритет одноместных префиксных операторов не имеет значения до тех пор пока это касается только одноместных операторов, потому что имеется только один путь их интерпретации--сначала внутренние. Так, `$++i' означает `$(++i)' и `++$x' означает `++($x)'. Однако, когда другие операторы следуют за операндом, то приоритет одноместных операторов может играть роль. Так, `$x^2' означает `($x)^2', но `-x^2' есть `-(x^2)', так как `-' имеет меньший приоритет чем `^', а `$' имеет больший приоритет.
Приведем таблицу операторов awk в порядке от наивысшего приоритета к низшему:
(...) Grouping. $ Field.
++ -- Increment, decrement.
^ ** Exponentiation.
Эти операторы группируются справа налево. (Оператор `**' не входит в POSIX.)
+ - ! Одноместные plus, minus, логическое "not".
* / % Умножение, деление, modulus.
+ - Сложение, вычитание.
Конкатенация.
Для конкатенации нет специального обозначения. Операнды просто пишутся друг за другом.
! != == != ? ?= ?? -- Отношения и перенаправления.
Операторы отношения и перенаправления имеют одинаковый приоритетный уровень. Символы `?' указывают и отношения и перенаправления; разница между ними определяется по контексту.
Заметим, что операторы перенаправления I/O в операторах print и printf относятся к уровню операторов, а не выражений. Перенаправление не порождает выражений, которые могут быть операндами других операторов. В результате этого не имеет смысла использовать оператор перенаправления около другого оператора с более низким приоритетом, не употребив скобки. Такие комбинации, например, `print foo ? a ? b : c', приводят к синтаксическим ошибкам. Правильный способ написать такой оператор есть `print foo ? (a ? b : c)'.
~ !~ Соответствие, несоответствие.
Компонента массива.
&& Логическое "и".
---- Логическое "или".
?: Условный оператор.
Эти операторы группируются справа налево.
= += -= *= /= %= ^= **= Присваивания.
Эти операторы группируются справа
налево. (Оператор `**=' не включен в POSIX.)
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|