Выражения и присваивания в языках программирования

advertisement
Выражения и присваивания в языках программирования
Нотация выражений
Любой язык программирования включает в себя средства описания данных и средства
описания действий.
Средства описания данных декларируют элементы и типы данных, используемые в
программе.
Средства описания действий указывают действия, исполняемые программой.
Простейшим средством описания действий является выражение.
Выражение задает действия, которые вычисляют единственное значение. Состоит из
констант, переменных, а также знаков операций и скобок.
Элементы данных, к которым применяется операция, называют операндами.
ЯП вносит некоторую специфику в запись математических выражений.
Обычно в ЯП используют смесь нотаций (способов записи выражений)
Различают три нотации: инфиксная,
Пример – бинарная операция. Бинарной называют операцию, применяемую к двум
операндам.
Инфиксная нотация a + b
Префиксная нотация + a b
Постфиксная нотация ab+
Выражение может заключаться в скобки, что не влияет на его значение.
Префиксную и постфиксную нотацию называют бесскобочными.
Префиксная нотация выражения
Выражение в префиксной нотации определяется так:
 Префиксная нотация константы или переменной – это сама константа или
переменная;
Применение операции ор к подвыражениям Е1 и Е2 записывается в виде ор Е1 Е2

Преимущество –префиксное выражение декодируется простым просмотром слева
направо.
В нотации нет никакой неоднозначности и нет необходимости применять скобки.
Способ изобрел польский математик Лукашевич, поэтому для обозначения нотации
применяют название польская запись.
Префиксная нотация может применяться только к операндам с фиксированным
количеством k (k>0) операндов.
Количество операндов операции определяет ее арность (местность)
Специальные варианты префиксной нотации
read (a,b,c) (max x y) позволяют записывать операции с переменным количеством
операндов (кембриджская польская запись).
В кембриджской польской записи операция и ее аргументы заключают в скобки.
Используется в языке LISP.
 Префиксная нотация удобна для представления операций с любым количеством
операндов.
 Префиксное выражение достаточно легко вычислить механически
Постфиксная нотация выражений
Выражение в постфиксной нотации определяется так:
 Постфиксная нотация константы или переменной – это сама константа или
переменная;
Применение операции ор к подвыражениям Е1 и Е2 записывается в виде Е1 Е2 ор

(обратная польская запись)
Преимущество –постфиксное выражение может вычисляться механически с
помощью структуры данных стек.
Инфиксная нотация выражений
В инфиксной нотации операции проставляются между их операндами.
Преимущество: легко читается человеком.
Проблемы в использовании:
1. поскольку инфиксная нотация определена лишь для бинарных операций, язык
программирования не может использовать только одну эту форму для записи
выражений, но обязательно должен сочетать ее с префиксной (постфиксной). Это
усложняет компиляцию
2. При появлении в выражении нескольких инфиксных выражений для устранения
неоднозначности приходится использовать скобки.
Как декодировать выражение a + b * c
Для ответа на этот вопрос вводятся понятия приоритетности и ассоциативности
операций.
Приоритетность определяет порядок применения операций в выражении. Операция
высокого приоритета выбирает свои операнды перед операцией низкого приоритета.
Ассоциативность задает порядок группировки в выражении операций с одинаковым
приоритетом.
Левоассоциативная операция – подвыражения, содержащие ее множественные
вхождения, группируются слева направо. (+,-,*,/)
Правоассоциативная операция – подвыражения, содержащие ее множественные
вхождения, группируются справа налево. (операция возведения в втепень)
Смешанная нотация
Операции, определяемые комбинацией символов, нельзя классифицировать в
терминах префиксной, инфиксной и постфиксной нотации.
Пример
if a > b then a else b
Здесь используются ключевые (служебные) слова if, then, else.
Значащими компонентами этого выражения являются условие a > b и выражения
aи b.
Говорят, что операция имеет смешанную нотацию, если ее значащие компоненты
перемежаются со служебными словами (или символами)
Присваивание
Как правило, вычисленное значение выражения нужно где-то запомнить. Такую
задачу решает операция присваивания.
Используемая терминология.
Будем называть операнды выражения объектами данных.
Объект данных – это операнд, находящийся в ячейке памяти.
Присваивание – это элементарная операция, изменяющая связывание объекта данных
со значением. Такое изменение считается побочным эффектом присваивания.
Поскольку присваивание является двухместной операцией, применительно к ее
инфиксной нотации будем различать ее левый и правый операдны.
Условимся описывать двухместные операции в следующем формате
символ_операции: тип_первого_аргумента х тип_второго_аргумента → тип_результата
В языке Pascal присваивание имеет такой смысл: скопировать в один (левый) объект
данных значение, содержащееся в другом (правом) объекте такого же типа, но не
возвращать явный результат. При этом изменение значения левого объекта считается
неявным результатом (побочным эффектом) присваивания.
Соответственно спецификация операции присваивания в языке Рascal примет вид:
присваивание (:=) тип х тип → пустой тип_(void)
В языке С смысл у присваивания несколько иной: скопировать в левый объект данных
значение, содержащееся в правом объекте данных такого же типа, а также вернуть
результат – объект данных, содержащий копию присвоенного значения.
Спецификация операции присваивания в языке С имеет вид:
присваивание (=) тип х тип → тип_
Download