В языках программирования , научных калькуляторов и аналогичных общего оператора нотации или грамматики оператора является способ определения и анализа математических и других формальных выражений. В этой модели линейная последовательность токенов делится на два класса: операторы и операнды.
Операнды - это объекты, с которыми работают операторы. К ним относятся буквальные числа и другие константы, а также идентификаторы (имена), которые могут представлять что угодно, от простых скалярных переменных до сложных агрегированных структур и объектов, в зависимости от сложности и возможностей используемого языка, а также контекста использования. Одним из специальных типов операндов является группа скобок. Выражение, заключенное в круглые скобки, обычно рекурсивно оценивается для обработки как один операнд на следующем уровне оценки.
Каждому оператору дается позиция, приоритет и ассоциативность. Приоритет операторов является числом (от максимума до минимума или наоборот) , что определяет , какой оператор принимает операнд , который окружен двумя операторами различного приоритета (или приоритета). Умножение обычно имеет более высокий приоритет, чем сложение, например [1] , поэтому 3 + 4 × 5 = 3+ (4 × 5) ≠ (3 + 4) × 5.
С точки зрения позиции оператора, оператор может быть префиксным, постфиксным или инфиксным. Оператор префикс непосредственно предшествует операнд, как в -х. Постфиксный оператор немедленно преуспевает операнд, как в х! например. Инфиксный оператор расположен между левым и правым операндом, как и в й + у. Некоторые языки, в первую очередь семейство C-синтаксиса, расширяют эту традиционную терминологию и говорят также о тернарных инфиксных операторах (a? B: c). Теоретически было бы даже возможно (но не обязательно практично) определить скобки как операцию унарного бификса.
Ассоциативность операторов
Ассоциативность операторов определяет, что происходит, когда операнд окружен операторами с таким же приоритетом, как в 1-2-3: оператор может быть левоассоциативным , правоассоциативным или неассоциативным . Левоассоциативные операторы применяются к операндам в порядке слева направо, а правоассоциативные операторы - наоборот. Основные арифметические операторы обычно левоассоциативны [1], что означает, например, что 1-2-3 = (1-2) -3 ≠ 1- (2-3). Это не относится к операторам более высокого уровня. Например, возведение в степень обычно является правоассоциативным в математике [1], но реализовано как левоассоциативное в некоторых компьютерных приложениях, таких как Excel. В языках программирования, где присваивание реализовано как оператор, этот оператор часто является правоассоциативным. Если это так, то такой оператор, как a: = b: = c , будет эквивалентен a: = (b: = c) , что означает, что значение c копируется в b, которое затем копируется в a. Неассоциативный оператор не может конкурировать за операнды с операторами равного приоритета. В Прологе , например, оператор инфиксным : - неассоциативен, поэтому такие конструкции, как a: - b: - c - синтаксические ошибки. Унарные префиксные операторы, такие как - (отрицание) или sin (тригонометрическая функция), обычно являются ассоциативными префиксными операторами. Когда более одного ассоциативного префикса или постфиксного оператора с равным приоритетом предшествуют или следуют за операндом, операторы, наиболее близкие к операнду, идут первыми. Итак, −sin x = - (sin x) и sin -x = sin (-x).
Математически ориентированные языки (например, в научных калькуляторах ) иногда позволяют неявное умножение с более высоким приоритетом, чем префиксные операторы (такие как sin), так что, например, sin 2x + 1 = (sin (2x)) + 1. [ необходима цитата ]
Однако префиксные (и постфиксные) операторы не обязательно имеют более высокий приоритет, чем все инфиксные операторы. В некоторых (гипотетических) языках программирования вполне может быть оператор sin с приоритетом ниже ×, но выше, например, +. На таком языке sin 2 · x + 1 = sin (2 · x) +1 будет истинным, а не (sin 2) · x + 1, как это обычно бывает.
Правила оценки выражений обычно бывают тройными:
- Рассматривайте любое подвыражение в круглых скобках как один рекурсивно вычисляемый операнд (хотя могут быть разные типы скобок с разной семантикой).
- Свяжите операнды с операторами с более высоким приоритетом перед операторами с более низким приоритетом.
- Для равного приоритета привяжите операнды к операторам в соответствии с ассоциативностью операторов.
Еще несколько примеров:
- 1-2 + 3/4 * 5 + 6 + 7 = (((1-2) + ((3/4) * 5)) + 6) +7
- 4 + -x + 3 = (4 + (-x)) + 3
Обобщения общих обозначений операторов
Использование классов приоритета операторов и ассоциативности - лишь один из способов. Однако это не самый общий способ: эта модель не может дать оператору больший приоритет при конкуренции с «-», чем при конкуренции с «+», при этом обеспечивая «+» и «-» эквивалентные приоритеты и ассоциативность. Обобщенную версию этой модели (в которой каждому оператору может быть дан независимый левый и правый приоритет) можно найти в [1] .
Смотрите также
Рекомендации
- ^ a b c Бронштейн, Илья Николаевич; Семендяев, Константин Адольфович (1987) [1945]. «2.4.1.1.». В Гроше, Гюнтер; Зиглер, Виктор; Зиглер, Доротея (ред.). Taschenbuch der Mathematik (на немецком языке). 1 . Перевод Виктор Зиглер. Вайс, Юрген (23-е изд.). Тун и Франкфурт-на-Майне: Verlag Harri Deutsch (и BG Teubner Verlagsgesellschaft , Лейпциг). С. 115–120. ISBN 3-87144-492-8.