Выражения и присваивания в языках программирования Нотация выражений Любой язык программирования включает в себя средства описания данных и средства описания действий. Средства описания данных декларируют элементы и типы данных, используемые в программе. Средства описания действий указывают действия, исполняемые программой. Простейшим средством описания действий является выражение. Выражение задает действия, которые вычисляют единственное значение. Состоит из констант, переменных, а также знаков операций и скобок. Элементы данных, к которым применяется операция, называют операндами. ЯП вносит некоторую специфику в запись математических выражений. Обычно в ЯП используют смесь нотаций (способов записи выражений) Различают три нотации: инфиксная, Пример – бинарная операция. Бинарной называют операцию, применяемую к двум операндам. Инфиксная нотация 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) В языке С смысл у присваивания несколько иной: скопировать в левый объект данных значение, содержащееся в правом объекте данных такого же типа, а также вернуть результат – объект данных, содержащий копию присвоенного значения. Спецификация операции присваивания в языке С имеет вид: присваивание (=) тип х тип → тип_