Что обозначает и как используется в записи алгоритмов знак присваивания
Присваивание (программирование)
Содержание
Присва́ивание (иногда присвое́ние) — механизм в программировании, позволяющий динамически изменять связи объектов данных (как правило, переменных) с их значениями. Строго говоря, изменение значений является побочным эффектом операции присвоения, и во многих современных языках программирования сама операция также возвращает некоторый результат (как правило, копию присвоенного значения). На физическом уровне результат операции присвоения состоит в проведении записи и перезаписи ячеек памяти или регистров процессора.
Присваивание является одной из центральных конструкций в императивных языках программирования, эффективно и просто реализуется на фон-неймановской архитектуре, которая является основой современных компьютеров.
В логическом программировании принят другой, алгебраический подход. Обычного («разрушающего») присвоения здесь нет. Существуют только неизвестные, которые ещё не вычислены, и соответствующие идентификаторы для обозначения этих неизвестных. Программа только определяет их значения, сами они постоянны. Конечно, в реализации программа производит запись в память, но языки программирования этого не отражают, давая программисту возможность работать с идентификаторами постоянных значений, а не с переменными.
В чистом функциональном программировании не используются переменные, и явный оператор присваивания не нужен.
Определение присваивания
Общий синтаксис простого присваивания выглядит следующим образом:
«Выражение слева» должно после вычисления привести к местоположению объекта данных, к целевой переменной, идентификатору ячейки памяти, в которую будет производиться запись. Такие ссылки называются «левосторонними значениями» (англ. lvalue ). Типичные примеры левостороннего значения — имя переменной ( x ), путь к переменной в пространстве имён и библиотеках ( Namespace.Library.Object.AnotherObject.Property ), путь к массиву с выражением на месте индекса ( this.a[i+j*k] ), но ниже в данной статье приведены и более сложные варианты.
«Выражение справа» должно обозначать тем или иным способом ту величину, которая будет присвоена объекту данных. Таким образом, даже если справа стои́т имя той же переменной, что и слева, интерпретируется оно иначе — такие ссылки называются «правосторонними значениями» (англ. rvalue ). Дальнейшие ограничения на выражение накладывает используемый язык: так, в статически типизированных языках оно должно иметь тот же тип, что и целевая переменная, либо тип, приводимый к нему; в некоторых языках (например, Си или a=b=c ).
Данная запись эквивалентна вызову функции. Аналогично, в КОБОЛе старого стиля:
Алгоритм работы оператора присваивания
Символ присваивания
Выбор символа присваивания является поводом для споров разработчиков языков. Существует мнение, что использование символа = для присвоения запутывает программистов, а также ставит сложный для хорошего решения вопрос о выборе символа для оператора равенства.
Эта плохая идея низвергает вековую традицию использования знака «=» для обозначения сравнения на равенство, предиката, принимающего значения «истина» или «ложь».
Выбор символа оператора равенства в языке при использовании = как присваивания решается:
Запись равенства в Си == является источником частых ошибок из-за возможности использования присваивания в управляющих конструкциях, но в других языках проблема решается введением дополнительных ограничений.
Например, в выражении языка ПЛ/1:
Семантические особенности
Далеко не всегда «интуитивный» (для программистов императивных языков) способ интерпретации присваивания является единственно верным и возможным.
Бывает, по используемому синтаксису, в императивных языках невозможно понять как реализуется семантика присваивания, если это, явно, не определено в языке.
Например в Forth языке, используется присваивание значения, когда данные между операциями, проходят через стек данных, при этом сама операции не является указателем на связываемые данные, а только выполняет действия предписанные операции.
Следствием чего можно провести присваивание данных, сформированных(расположенных) далеко от операции присваивания.
Рассмотрим простой пример для вышесказанного:
или так то же самое(семантически):
Неоднозначность присваивания
Это можно понять как «результат вычисления 2+1 (то есть 3) присваивается переменной X » или как «операция 2+1 присваивается переменной X ». Если язык статически типизирован, то двусмысленности нет, она разрешается типом переменной X («целое число» или «операция»). В языке Пролог типизация динамическая, поэтому существуют две операции присвоения: is — присвоение эквивалентного значения и = — присвоение образца. В таком случае:
Первая последовательность будет признана верной, вторая — ложной.
Семантика ссылок
При работе с объектами больших размеров и сложной структуры многие языки используют так называемую «семантику ссылок». Это означает, что присвоения в классическом смысле не происходит, но считается, что значение целевой переменной располагается на том же месте, что и значение исходной. Например (
Подмена операции
Многие языки предоставляют возможность подмены смысла присвоения: либо через механизм свойств, либо через перегрузку оператора присвоения. Подмена может понадобится для выполнения проверок на допустимость присваиваемого значения или любых других дополнительных операций. Перегрузка оператора присвоения часто используется для обеспечения «глубокого копирования», то есть копирования значений, а не ссылок, которые во многих языка копируются по умолчанию.
Такие механизмы позволяют обеспечить удобство при работе, так для программиста нет различия между использованием встроенного оператора и перегруженного. По этой же причине возможны проблемы, так как действия перегруженного оператора могут быть абсолютно отличны от действий оператора по умолчанию, а вызов функции не очевиден и легко может быть принят за встроенную операцию.
Расширения конструкции присваивания
Поскольку операция присвоения является широко используемой, разработчики языков программирования пытаются разработать новые конструкции для упрощённой записи типичных операций (добавить в язык так называемый «синтаксический сахар»). Кроме этого в низкоуровневых языках программирования часто критерием включения операции является возможность компиляции в эффективный исполняемый код. [2] Особенно известен данным свойством язык Си.
Множественные целевые объекты
Одной из альтернатив простого оператора является возможность присвоения значения выражения нескольким объектам. Например, в языке ПЛ/1 оператор
Аналогичное присвоение в языке
В отличие от ПЛ/1, Ады и Питона, где множественное присвоение считается только сокращённой формой записи, в языках Си, Лисп и других данный синтаксис имеет строгую основу: просто оператор присвоения возвращает присвоенное им значение (см. выше). Таким образом, последний пример — это на самом деле:
Строчка такого вида сработает в Си (если добавить точку с запятой в конце), но вызовет ошибку в Питоне.
Параллельное присваивание
Некоторые языки, например Руби и
Считается, что такое присвоение выполняется одновременно и параллельно, что позволяет коротко реализовать с помощью такой конструкции операцию обмена значений двух переменных.
запись с использованием параллельного присваивания | «традиционное» присвоение: требует дополнительной переменной и трёх операций |
---|
Некоторые языки (например,
Условные целевые объекты
Некоторые языки программирования, например, C++ и
Другой вариант условного присваивания (Руби):
Составные операторы присваивания
Составной оператор присваивания позволяет сокращённо задавать часто используемую форму присвоения. С помощью этого способа можно сократить запись присвоения, при котором целевая переменная используется в качестве первого операнда в правой части выражения, например:
Унарные операторы присваивания
Ниже приведён пример использования оператора инкрементации для формирования завершённого оператора присвоения
увеличение значения переменной на единицу | эквивалентная расширенная запись |
---|
Операторы инкрементации и декрементации в языке Си часто являются сокращённой записью для формирования выражений, содержащих индексы массивов.
Объекты алгоритмов. Команда присваивания
Урок 16. Информатика 8 класс (ФГОС)
В данный момент вы не можете посмотреть или раздать видеоурок ученикам
Чтобы получить доступ к этому и другим видеоурокам комплекта, вам нужно добавить его в личный кабинет, приобрев в каталоге.
Получите невероятные возможности
Конспект урока «Объекты алгоритмов. Команда присваивания»
· Применение команды присваивания при записи алгоритмов;
Команда присваивания является одной из основных команд в алгоритмах работы с величинами. То есть величина получает своё значение путём выполнения команды присваивания.
Операция присваивания обозначается знаком двоеточие равно, произносится – присвоить и записывается следующим образом: имя переменной присвоить выражение.
Здесь понятие выражение задаёт порядок выполнения действий над данными и может включать в себя переменные, константы всех типов, знаки операций, стандартные функции, круглые скобки.
Давайте разберёмся, что означает запись
Данную запись можно пояснить так:
В ящик с надписью h надо положить двенадцать, например, мячей. После выполнения этой команды h=12.
То есть команда m:=n означает, что мы должны присвоить переменной m такое же значение, какое имеет величина n, при этом значение второй величины n не изменится.
Нельзя путать знак присваивания со знаком равенства, так, например, при выполнении следующей команды присваивания z:=z+1, величина z станет равной предыдущему значению z, увеличенному на 1. Ясно, что использование в этой записи знака равенства недопустимо, так как никакое z не равно z+1.
Выбор символа присваивания является поводом для споров программистов. Так как использование знака равно для присвоения их запутывает. В результате чего возникает сложный вопрос о выборе символа для оператора сравнения.
Так, Никлаус Вирт утверждал:
Общеизвестно плохим примером является выбор знака равенства для обозначения присваивания. Эта спорная идея опровергает вековую традицию использования знака равно для обозначения равенства двух величин, или высказываний, принимающих значения «истина» или «ложь».
Реализацией этой позиции Вирта можно считать то, что в языке Паскаль, автором которого он является, и который вы будете изучать, оператором присваивания является двоеточие равно, в то время как для сравнения используется просто равно.
Теперь разберёмся с основными свойствами команды присваивания.
Рассмотрим пример. Нам необходимо заполнить таблицу и выяснить чему равны начальные и конечные значения переменных а и b.
Итак, первая команда а :=1. Значит значение переменной а=1 стало равным единице. Переменной b пока не присвоено значения, поэтому она остаётся неопределённой.
Эта особенность является первым свойством присваивания.
То есть, пока переменной не присвоено значение, она остаётся неопределённой;
Заполним следующую строку. Здесь присваивается значение переменной b. Значение, присвоенное переменной а, сохраняется пока не выполнится следующее присваивание, поэтому записываем 1;
Эта особенность является вторым свойством присваивания.
То есть, значение, присвоенное переменной, сохраняется вплоть до выполнения следующего присваивания этой переменной нового значения;
Переменной b:=2*1. То есть значение переменной b=2.
Заполним следующую строку. Переменной а присваиваем значение переменной b. Значение b=2, следовательно, а =2.
Эта особенность является третьим свойством присваивания.
То есть, новое значение, присвоенное переменной, заменяет её предыдущее значение.
Значение переменной b по второму свойству сохраняется. При заполнении последней строки сохраняется значение переменной а.
Переменной b:=a+b. a=2 и b=2. Получаем значение b=4.
В задании необходимо было выяснить, чему равны начальные и конечные значения переменных а и b. Начальное значение переменной а =1, а переменной b=2. Конечные значения, которые получают переменные а и b, соответственно равны 2 и 4.
Таким образом основные особенности команды присваивания таковы:
1. Пока переменной не присвоено значение, она остаётся неопределённой;
2. Значение, присвоенное переменной, сохраняется вплоть до выполнения следующего присваивания этой переменной нового значения;
3. Новое значение, присвоенное переменной, заменяет её предыдущее значение.
Рассмотрим последовательность выполнения команды присваивания:
в первую очередь вычисляется значение выражения, затем результат вычисления присваивается переменной, стоящей слева от знака присваивания.
Например, пусть начальное значение переменной k=1.
После вычисления значения выражения мы присваиваем переменной k:=24,5.
Также важно отметить что, необходимо чтобы тип выражения был совместим с типом соответствующей переменной.
Перейдём к практической части урока.
Первое задание. Необходимо определить, чему станет равна величина k, после выполнения следующего ряда присвоений:
Итак, после выполнения первой команды присваивания k=4. После выполнения второй команды k=20, после третьей k=30, четвёртой – k=10 и пятой – k=0.
То есть, обратите внимание, после присваивания величине нового значения старое забывается.
Следующее задание. Необходимо ответить на вопрос: какое минимальное количество промежуточных переменных потребуется для того, чтобы переменной k было присвоено значение переменной m, переменной m — значение переменной n, а переменной n — значение переменной k? И записать соответствующий алгоритм на алгоритмическом языке.
Для того чтобы правильно решить данную задачу воспользуемся аналогией. Пусть имеются три коробки оранжевого, голубого и зелёного цвета. В этих коробках лежат шарики. В оранжевой коробке лежат шарики зелёного цвета, в голубой коробке лежат шарики оранжевого цвета, а в зелёной коробке – шарики голубого цвета. Необходимо переложить шарики так, чтобы цвета совпали.
Для того чтобы переложить шарики правильно, необходима дополнительная коробка. Тогда можно поступить следующим образом.
Пересыпаем голубые шарики из зелёной коробки в дополнительную. Теперь мы можем пересыпать зелёные шарики из оранжевой коробки в зелёную коробку.
Следующий шаг. Пересыпаем оранжевые шарики из голубой коробки в оранжевую коробку. И последний шаг. Пересыпаем голубые шарики из дополнительной коробки в голубую коробку.
Обратите внимание, для решения данной задачи достаточно было взять одну дополнительную коробку и больше не нужно.
То есть для того чтобы поменять значения трёх величин достаточно ввести одну дополнительную величину.
Для решения нашей задачи введём промежуточную переменную z. Тогда запишем алгоритм обмена значениями k, m и n.
В результате переменной k присвоено значение переменной m, переменной m — значение переменной n, а переменной n — значение переменной k и для этого достаточно ввести одну промежуточную переменную.
Пришло время подвести итоги урока.
Сегодня на уроке мы с вами выяснили, что
Команда присваивания является одной из основных команд в алгоритмах работы с величинами. То есть величина получает своё значение путём выполнения команды присваивания.
Рассмотрели последовательность выполнения команды присваивания
На примере разобрались с основными свойствами команды присваивания.
А также составили алгоритм, в результате которого переменные a, b и c литерного типа обменялись своими значениями.
Почему «=» означает присваивание?
Давайте посмотрим на следующий код:
В среде ФП часто критикуют данный момент императивного программирования: «Как так может быть, что a = a + 1? Это всё равно что сказать „1 = 2“. В мутабельном присваивании нет смысла».
На этот вопрос обычно отвечают «потому что так сделано в C». Но это похоже на перекладывание ответственности на кого-то другого: кто из нас знает, почему так сделано в C? Давайте разбираться вместе!
Большая четвёрка
В начале 1960-ых существовало четыре доминирующих высокоуровневых языка: COBOL, FORTRAN II, ALGOL-60, и LISP. В то время, программисты разбивали присваивание на два класса: инициализацию (initialization) — когда вы впервые определяете переменную, и переприсвоение (reassignment) — когда вы вы изменяется значение существующей переменной.
Итак, давайте добавим комментарии к нашему примеру на Python и получим следующий код:
Но мы-то с вами знаем, что C происходит от ALGOL; что, в свою очередь, означает, что по какой-то причине было решено отказаться от оператора присваивания := и изменить значение оператора = с проверки на равенство…
ALGOL порождает CPL
ALGOL-60, скорее всего, является одним из самых влиятельных языков программирования в истории computer science. Вероятно, что при всём этом он также является одним из самых бесполезных языков. В основной спецификации языка намеренно не было предусмотрено никакой функциональности для ввода/вывода. Вы могли «захардкодить» вводы и измерять выводы, но если вам нужно было сделать с ними что-либо полезное, вам требовалось найти компилятор, который расширял бы базовый язык. ALGOL был спроектирован с целью исследования алгоритмов и поэтому он «ломался», когда вы пытались сделать на нём что-либо ещё.
Всего год спустя Кен Айверсон создаст APL, который станет использовать символ ← для всех видов присваиваний. Поскольку на большинстве клавиатур такой клавиши нет и никогда не было, от него быстро откажется и сам автор — его следующий язык, J, тоже будет использовать для присваиваний символ =: [2]. Однако, APL глубоко повлиял на S, который в свою очередь глубоко повлиял на R — вот почему является предпочтительным оператором присваивания в R.
CPL порождает BCPL
CPL был замечательным языком, обладавшим всего одним небольшим недостатком: ни у кого не получалось написать его реализацию. Несколько человек смогли частично реализовать различные подмножества из его «фич», но этот язык оказался слишком большим и сложным для компиляторов той эпохи. Поэтому неудивительно, что Мартин Ричардс решил избавиться от ненужной сложности ящика и создал BCPL. Первый компилятор BCPL появился в 1967 году… а первый компилятор CPL — лишь в 1970-м.
Насколько мне известно, BCPL был также первым «слабо типизированным» языком, поскольку единственным типом данных было машинное слово (data word)[3]. Это позволило сделать компилятор куда более портабельным за счет потенциального увеличения количества логических ошибок, но Ричардс надеялся на то, что улучшения в процессе и наименования с описанием позволят противостоять этому. Помимо все этого, именно в BCPL впервые появились фигурные скобки с целью определения блоков.
BCPL порождает B
Если вы оставите в стороне использование поименованных адресов глобальной памяти, в BCPL всегда использовались следующие обозначения: = для инициализации и := для переприсваивания (reassignment). Томпсон решил, что эти вещи можно совместить в единый токен, который можно использовать для всех видов присваивания, и выбрал =, поскольку оно было короче. Однако, это привнесло некоторую неоднозначность: если x уже был объявлен, то чем было x = y — присваиванием или проверкой на равенство? И это ещё не всё — в некоторых случаях предполагалось, что это обе операции сразу! Поэтому он был вынужден добавить новый токен == как единую форму выражения смысла «равняется этому». Как выражался сам Томпсон:
Поскольку присваивание в типовой программе встречается примерно в два раза чаще, чем сравнение на равенство, уместно было сделать оператор присваивания вполовину короче.
За время, прошедшее между появлением BCPL и B, была создана Simula 67, первый объектно-ориентированный язык. Simula последовала соглашениям ALGOL о строгом разделении шагов инициализации и переприсвоения. Алан Кей примерно в это же время начал работу над Smalltalk, который добавил блоки, но последовал такому же синтаксису.
B порождает C
… остальное – уже история.
2 занятие
Тема: Оператор присваивания. Арифметические выражения. Типы данных.
Первый оператор, с которым мы познакомимся,- оператор присваивания.
имя величины := выражение
Например, V:=A; или V:=A+1;
При помощи оператора присваивания переменной могут присваиваться константы и выражения, значения переменных любого типа.
Как только в программе встречается переменная, для неё в памяти отводится место. Оператор присваивания помещает значение переменной или значение выражения в отведённое место.
Если в процессе выполнения программы встречается пере присваивание (т.е. та же самая переменная принимает другое значение), то старое значение переменной стирается, на свободное место записывается новое значение. Команда присваивания позволяет лучше понять смысл слова переменная (т.е. меняющая своё значение по ходу программы).
Выражение может быть арифметическим, логическим или литерным. Важно, чтобы тип величины был согласован с видом выражения.
Арифметические выражения должны быть записаны в так называемой линейной записи согласно следующим правилам:
Порядок выполнения операций
Порядок выполнения операций при вычислении арифметических выражений можно регулировать при помощи скобок по обычным правилам. Там, где скобки отсутствуют, ЭВМ выполняет операции в следующем порядке:
В нашем случае сначала переменной number1 присваивается значение равное 3 и переменной number2 присваивается значение равное 4, затем вычисляется значение выражения (number1 + number2) и оно присваивается переменной rezult.
Сумма чисел посчитана.
И, наконец, в конце раздела операторов стоит служебное слово End, после которого стоит точка.
Задание. Наберите текст программы на компьютере и выполните ее (для запуска программы воспользуйтесь комбинацией клавиш Ctrl и F9).
Внимание! Не забывайте о порядке на дискете и в файле:
Задание. Измените программу так, чтобы она подсчитывала сумму четырех чисел.
Сохраните файл на дискете, для этого из меню F10-File выберите команду Save и в предложенной строке наберите путь a:\Vvod\Summa (каталог Vvod должен быть уже организован для файлов, содержащих программы данной темы).
Основные определения. Типы данных.
Познакомимся с основными понятиями языка.
Примеры зарезервированных слов: AND, GOTO, PROGRAM, ELSE, IF, RECORD, NOT, ARRAY, REPEAT, UNTIL, BEGIN, IN, SET, END, CASE, CONST, USES, INTERFACE, STRING, LABEL, THEN, OF, DIV, TO, VAR, DO, TYPE, WHILE, DOWNTO, FILE, FUNCTION, PROCEDURE и другие.
Типы данных
Для временного хранения информации в операторах памяти машины в языке Паскаль используются константы и переменные. Они могут быть различных типов:
Над целыми типами определены такие операции:
В языке Паскаль числа могут быть представлены в двух видах: с фиксированной точкой и плавающей запятой.
Числа с фиксированной точкой изображаются десятичным числом с дробной частью, которая может быть и нулевой. Например, 27.9, 5.00
Компьютер, по умолчанию, представляет действительные числа в виде чисел с плавающей точкой. Такое представление чисел не очень нравится пользователям. Поэтому мы будем “заставлять” компьютер выдавать действительные числа в более привычном варианте следующим образом:
Например, если мы хотим вывести на экран число Chislo с фиксированной точкой, причем знаем, что для вывода целой части этого числа достаточно 7 мест, а вывод дробной части ограничим сотыми, то мы запишем вывод так:
Символьный тип (char):
Строковый тип (string):
Значением строковой величины является строка переменной длины (быть может пустая). Строковая константа или строковая переменная представляет собой произвольную последовательность символов, заключенную в апострофы. Например,
Var Stroka : string; |
Логический тип (boolean):
При проверке некоторых условий результат операции может быть истинным или ложным. Например, 3>5 ложь.
Более подробно этот тип данных мы рассмотрим при изучении условного оператора.
К сложным или структурированным типам относятся массивы, записи, множества, которые требуют специального изучения и здесь рассматриваться не будут.
Задание. Откройте новый файл. Создадим программу, в которой опишем несколько переменных разного типа, введем в них значения и выведем на экран.
Program TipDann; Uses Crt Var Chislo1 : Integer; Chislo2 : Real; Simvol : Char; Stroka : String; Logika : Boolean; Begin ClrScr; Chislo1:=12; Chislo2:=Chislo1*2; Chislo2:=Chislo2/5; Simvol:=‘d’; Stroka:=‘Строчка’; Logika:= Chislo1> Chislo2; WriteLn (‘Вывод значений:’); WriteLn (‘Значение переменной Chislo1 : ’,Chislo1); WriteLn (‘Значение переменной Chislo2 : ’,Chislo2:5:2); WriteLn (‘Значение переменной Simvol : ’,Simvol); WriteLn (‘Значение переменной Stroka : ’,Stroka); WriteLn (‘Значение переменной Logika : ’,Logika); End. |
Такое присваивание используют в программах, если предыдущее значение этой переменной уже не понадобится и для более рационального использования описанных переменных. Для того чтобы переменной символьного типа присвоить какой-либо символ (например, d), надо этот символ записать в апострофах (знак «’»). Аналогично поступают с переменными строкового типа (смотри следующую строку программы). А про переменные логического типа мы знаем, что им можно присваивать только два значения: True и False. В этой программе мы присвоим значение результата сравнения двух переменных, здесь оно будет равно True. А теперь выведем присвоенные значения на экран.
Задание. Измените значения переменных и проанализируйте результаты выполнения программы. Сохраните программу на дискете под правильным именем в соответствующем каталоге. Распечатайте программу.
- Что обозначает и в предложении часть речи
- Что обозначает и как формируется гомосфера