Оператор присваивания
где выражение может быть как простой одиночной константой, так и сложной комбинацией переменных, операторов и констант. Как в Бейсике и Фортране, в С используется знак равенства для отображения операции присваивания (не так, как в Паскале или Модуле-2, где используется конструкция :=). В левой части оператора присваивания должна стоять переменная, а не функция или константа.
- Многочисленное присваивание
- Преобразование типов при присваивании
- Инициализация переменных
Для чего используется оператор присваивания c
Выражение нельзя вычислить, например, в том случае, если оно содержит обращение к немодифицированному полю таблицы, в которой нет позиции.
<имя>— идентификатор переменной, поле таблицы, элемент массива. — выражение, результат вычисления которого присваивается. Элемент, имя которого указано в левой части оператора, и выражение в правой части оператора должны иметь один тип за исключением случая, когда элемент имеет вещественный тип, а выражение — целочисленный. Оператор присваивания можно использовать в вычисляемых выражениях (начиная с Атлантис 5.1.12). Приоритет оператора присваивания самый низкий т.е. выполняется в последнюю очередь. Значением оператора присваивания является значение выражения слева от знака присваивания после выполнения операции. Разрешено каскадное присваивание.имя>
Каскадное присваивание не даёт никакого выигрыша в скорости интерпретации.
- передача оператора присваивания в качестве var -параметра запрещена;
- разрешено использовать значение результата работы оператора присваивания внутри другого оператора присваивания;
- явное присваивание значения результату работы оператора присваивания запрещено;
- прочие виды присваивания результату работы оператора присваивания не рекомендуются к использованию;
- использование нескольких присваиваний одной и той же переменной в пределах одного вычисляемого выражения — сложная для понимаюия конструкция, при использовании которой необходимо внимательно вчитываться в код.
В случае, когда необходимо отделить оператор присваивания от вычисляемого выражения, необходимо использовать скобки. В противном случае компилятор будет считать, что производится операция присваивания всему выражению, которое стоит в левой части.
j := 1 + ( i := 5 );
j := 1 + i := 5;
т.к. присваивание значения выражению «j := 1 + i» запрещено.
Допускается опускать скобки при создании конструкции из нескольких идущих подряд операторов присваивания, например:
j := i := 6;
Employee.DayIn := Cur_Date;
a := b := c := d := 0; // эквивалентно d := 0; с := d; b := c; a := b;
Пример 3. Явное использование присвоения
Меssage(j := 2); // выдаст на экран сообщение "2" // в предыдущей строке выполняется код, аналогичный j := 2; Меssage(j); // но не j := 2; Меssage(2); Message(i := 2 + 1); // выдаст на экран "3" и в i положит 3. Message(i); // выдаст на экран "3" // В следующей строке оператор присваивания отделен от вычисляемого выражения скобками: Message((i := 2) + 1); // выдаст на экран "3", а в i положит 2. Message(i); // соответственно, выдаст на экран "2" Message(i * (i := 6)); // выдаст на экран "36" (6 * 6)
Пример 4. Вложенное использование
После выполнения кода переменная i примет значение «3».
Message(i := 1 + (i := 2)); // выдаст на экран сообщение "3"
Пример 5. Многократная вложенность присвоения
Пример содержит корректный но нечитабельный код. Приводится для иллюстрации работы оператора присвоения. Использовать подобный код в реальных программах категорически не рекомендуется.
var arr : array[1..5] of byte; arr[arr[arr[arr[arr[1]:=4]:=2]:=5]:=3]:=1;
Код порождает массив, как-бы инициализированный своими же индексами и циклически сдвинутый на 2 элемента:
arr[1] = 4 arr[2] = 5 arr[3] = 1 arr[4] = 2 arr[5] = 3
Пример 6. Неожиданный результат
Пример содержит корректный но нечитабельный код. Приводится для иллюстрации работы оператора присвоения. Использовать подобный код в реальных программах категорически не рекомендуется.
i := 1; i := i := i * 2 + (i := i * 5);
Данное выражение аналогично выражению:
i := (i := i * 2 + (i := i * 5));
которое аналогично следующему:
i := i * 2 + (i := i * 5);
В процессе выполнения часть (i * 2) возвращает 2, т.к. i до этого было 1. Часть (i := i * 5) возвращает 5, т.к. значение переменной i не менялось в процессе выполнения (i * 2). После этого значение «5» временно заносится в переменную i, производится сложение i с «2», результат записывается в i.
В результате i принимает значение 7.
Теперь заключим первое присвоение в скобочки. Полученный код имеет вид:
i := 1; i := (i := i * 2) + (i := i * 5);
Выполнение этого кода состоит из 4-х этапов:
- Выполняется часть (i := i * 2). Переменной i присваивается значение 2, оператор же присваивания возвращает i (но не 2!).
- Выполняется часть (i := i * 5). Т.к. переменная i уже имеет значение 2, то в результате получается 10, что и присваивается переменной i. Оператор возвращает опять же i, (но не 10, а именно i, которая в этот момент равна 10).
- Вызывается оператор суммирования, который складывает i c i. Т.к. ранг у присваивания самый высокий, то на момент суммирования переменная i несет в себе значение 10. Поэтому оператор суммирования возвращает 20 (уже численное значение).
- Переменной i присваивается 20.
Начиная с Атлантис 5.3.05 оператор присваивания в качестве результата возвращает не значение вычисляемого выражения, а ссылку на переменную, которой присваивается результат.
Использование оператора присваивания в вычисляемых выражениях и каскадное присваивание доступны начиная с Атлантис 5.1.12
Оператор присваивания
Оператор присваивания имеет особенность — он возвращает правое значение. Это значит, что можно использовать несколько операторов присваивания подряд, по цепочке.
#include #include int main()
В этом примере переменной c присваивается значение 10, после чего оператор присваивания возвращает значение 10, которое используется следующим оператором, и присваивает значение 10 переменной b, после чего возвращает значение 10, которое используется следующим оператором. Это свойство — возвращать значение — часто используется. Например, при выделении памяти мы можем узнать, была ли действительно выделена память.
#include #include #include int main() < int *a = NULL; printf("Try to allocate memory\n"); if (a = (int*)malloc(1024*1024*1024 * sizeof(int))) < printf("Memory was allocated"); >else < printf("Error: can't allocate memory"); >getch(); free(a); >
Здесь одновременно выделяется память и проверяется, что было возвращено при попытке получить память. Этот же пример может быть записан и так
a = (int*)malloc(1024*1024*1024 * sizeof(int)); if (a) < printf("Memory was allocated"); >else
(вам этот пример кажется непонятным, здесь важно для вас только использование оператора =).
rvalue и lvalue
Л юбая переменная связана с адресом в памяти и хранит некоторое значение. Выражение типа
int i; i = 20;
говорит о том, что мы заносим в область памяти, на которую указывает переменная i значение 20. Выражение
20 += 3;
не имеет смысла, поскольку 20 — это литерал, значение, которое не связано с областью памяти.
Для обозначения объектов, которым может быть присвоено значение, используется понятие lvalue (буквально, то, что может стоять слева от оператора присваивания). Для обозначения объектов, которые имеют только значения, используют выражение rvalue (то, что стоит справа от оператора присваивания). lvalues в свою очередь делят на modifiable lvalues, которые могут быть изменены, и non-modifiable lvalues, которые связаны с областью памяти, но не могут быть изменены, например, константы. В том случае, если lvalue стоит справа от оператора присваивания, например
int i, j; j = 20; i = j;
то происходит lvalue-to-rvalue convertion, преобразование lvalue к rvalue.
К rvalue относятся результаты арифметических выражений, преобразование не к ссылочным типам, результат постфиксных операций ++ и —, литералы за исключением строк.
К lvalue относятся переменные, выражения ссылочных типов, результат операции разыменования *, строковые литералы, результат префиксных операций ++ и — над ссылочными типами.
Имена функций и массивов, также объявленные как немодифицируемые объекты, являются non-modifiable lvalues.
ru-Cyrl 18- tutorial Sypachev S.S. 1989-04-14 sypachev_s_s@mail.ru Stepan Sypachev students

Всё ещё не понятно? – пиши вопросы на ящик
Ввод-вывод, оператор присваивания, арифметические операции
Оператор присваивания. Арифметические выражения. Типы данных
Оператор присваивания
Первый оператор, с которым мы познакомимся,- оператор присваивания.
Оператор присваивания — основной оператор любого языка программирования. Общая форма записи оператора:
имя величины := выражение
Например, V:=A; или V:=A+1;
При помощи оператора присваивания переменной могут присваиваться константы и выражения, значения переменных любого типа.
Как только в программе встречается переменная, для неё в памяти отводится место. Оператор присваивания помещает значение выражения в место, отведённое переменной.
Если в процессе выполнения программы встречается переприсваивание (т.е. та же самая переменная принимает другое значение), то старое значение переменной стирается, на свободное место записывается новое значение. Команда присваивания позволяет лучше понять смысл слова переменная (т.е. меняющая своё значение по ходу программы).
Выражение может быть арифметическим, логическим или литерным. Важно, чтобы тип величины был согласован с видом выражения.
Арифметические выражения
Арифметические выражения должны быть записаны в так называемой линейной записи согласно следующим правилам:
-
выражение должно быть записано в виде линейной цепочки символов;
Порядок выполнения операций при вычислении арифметических выражений можно регулировать при помощи скобок по обычным правилам. Там, где скобки отсутствуют, ЭВМ выполняет операции в следующем порядке:
-
вычисляет значение всех алгоритмов-функций и стандартных функций;
В нашем случае(*) сначала переменной number1 присваивается значение равное 3 и переменной number2 присваивается значение равное 4, затем вычисляется значение выражения (number1 + number2) и оно присваивается переменной result.
Сумма чисел посчитана.
Теперь надо вывести ее значение на экран. Для этого используют оператор Write — записать (вывести) на экран значение переменной, записанной в скобках. В нашем случае значение переменной number1, затем символ + , далее значение переменной number2, символ = и, наконец, значение результата result.
И, наконец, в конце раздела операторов стоит служебное слово End, после которого стоит точка.
Задание. Наберите текст программы на компьютере и выполните ее (для запуска программы воспользуйтесь комбинацией клавиш Ctrl и F9).
Внимание! Не забывайте о порядке на дискете и в файле:
-
имя программы должно соответствовать ее содержанию,
Задание. Измените программу так, чтобы она подсчитывала сумму четырех чисел.
Сохраните файл на дискете, для этого из меню F10-File выберите команду Save и в предложенной строке наберите путь a:\Vvod\Summa (каталог Vvod должен быть уже организован для файлов, содержащих программы данной темы).
Основные определения
Познакомимся с основными понятиями языка.
Алгоритм — четкая последовательность действий, необходимая для решения задачи.
Программа — алгоритм, записанный на языке программирования.
Алфавит языка — набор элементарных символов, используемый для составления программ. Алфавит содержит:
-
52 буквы латинского алфавита (строчные и заглавные);
Идентификатор (имя) – имя какого-либо элемента программы, которое должно удовлетворять следующим требованиям:
-
длина имени не должна превышать 63 символов;
Правильно выбранные идентификаторы значительно облегчают чтение и понимание программы, а также уменьшают вероятность появления ошибок при модификации программ. Например, значение даты удобнее обозначить идентификатором Date, чем просто буквой D или любым другим символом.
Зарезервированные (служебные) слова — это слова, использующиеся только по своему прямому назначению. Их нельзя использовать в качестве имен переменных, так как они выполняют определенную смысловую нагрузку.
Примеры зарезервированных слов: 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 и другие.
Переменные (Var) — вид данных, который может изменять свое значение в ходе программы, описывают переменные после зарезервированного слова Var.
Константы (Const) — вид данных, который является постоянным на всем протяжении выполнения программы, описывают константы после зарезервированного слова Const.
Комментарии — некоторая запись, служащая для пояснения программы, которая записывается в фигурных скобках.
Типы данных
Для временного хранения информации в операторах памяти машины в языке Паскаль используются константы и переменные. Они могут быть различных типов:
-
целых чисел (см. ниже);
| Название | Длина в байтах | Диапазон значений |
| Byte | 1 | 0 . 255 |
| ShortInt | 1 | -128 . 127 |
| Word | 2 | 0 . 65535 |
| Integer | 2 | -32768 . 32767 |
| LongInt | 4 | -2147483648 . 2147483647 |
Над целыми типами определены такие операции:
- «+» — сложение;
- » * » — умножение;
- » — » вычитание;
- div — целочисленное деление;
- mod — получение остатка от целочисленного деления.
Вещественные типы:
Вещественные типы представляются с некоторой точностью, которая зависит от компьютера. Вам необходимо знать, что вещественный тип разделяется на несколько типов, но использовать мы будем вещественные данные только типа Real, которые занимают 6 байт, имеют диапазон возможных значений модуля от 2.9Е-39 до 1.7Е+38 и точность представления данных — 11. 12 значащих цифр.
Примечание. Несмотря на то, что в Turbo Pascal имеется широкий выбор вещественных типов, доступ к некоторым из них (single, double, extended) возможен при особых режимах компиляции. Особое положение в Turbo Pascal занимает тип comp, трактующийся как вещественное число без экспоненциальной и дробной частей. Он сохраняет 19 — 20 значащих цифр и знак числа. В то же время comp полностью совместим с любыми другими вещественными типами.
В языке Паскаль числа могут быть представлены в двух видах: с фиксированной точкой и плавающей точкой.
Числа с фиксированной точкой изображаются десятичным числом с дробной частью, которая может быть и нулевой. Например, 27.9, 5.00
Такие большие числа, как 137.000.000, можно записать в формате с десятичным порядком: 1.37 · 10 8 . В Turbo Pascal для подобных чисел принята форма записи mEp, где m — мантисса; E — признак записи числа с десятичным порядком; p — показатель степени числа 10. Такое представление чисел и называется форматом с плавающей точкой. Число 1.37 · 10 8 в этом формате запишется так: 1.37Е+8. Рассмотрим еще несколько примеров:
| Математическая запись | Запись на Паскале |
| 4·10 -4 | 4E -4 |
| 0,62·10 5 | 0.62E+5 |
| -10,88·10 12 | -10.88E12 |
По умолчанию, действительные числа выводятся в виде чисел с плавающей точкой. Такое представление чисел не очень нравится пользователям. Поэтому мы будем “заставлять” компьютер выдавать действительные числа в более привычном варианте следующим образом:
R:m:n, где R – действительное число, m – общее количество позиций, отводимых числа, n – количество позиций, отводимых для дробной части.
Например, если мы хотим вывести на экран число Chislo с фиксированной точкой, причем знаем, что для вывода этого числа достаточно 7 мест, а вывод дробной части ограничим сотыми, то мы запишем вывод так:
| Write (Chislo:7:2) |
Символьный тип (char):
Значением величины данного типа является символ из множество всех символов компьютера: русская или латинская большая или маленькая буква, цифра, знак препинания, специальный знак (например, «+», «-«, «*», «/», «», «=» и др.) или пробел » «. Каждый из символов имеет уникальный номер от 0 до 255, т. е. внутренний код, который возвращает функция ORD. Символьная константа – любой символ языка, заключённый в одинарные кавычки. Например,
| Var Simvol : char; |
Строковый тип (string):
Значением строковой величины является строка переменной длины (быть может, пустая). Строковая константа представляет собой произвольную последовательность символов, заключенную в одинарные кавычки. Например,
| Var Stroka : string; |
Логический тип (boolean):
Логический тип данных часто называют булевым по имени английского математика Д. Буля, создателя математической логики. В языке Паскаль имеются две логические константы TRUE и FALSE. Логическая переменная принимает одно из этих значений и имеет тип Boolean. Для сравнения данных предусмотрены следующие операции отношения: , >, >= Результат операции отношения имеет логический тип, т.е. результат операции может быть истинным или ложным, например, 3>5 – ложь.
Над величинами этого типа можно выполнять специфические логические операции OR — или; AND — и; NOT — не.
Более подробно этот тип данных мы рассмотрим при изучении условного оператора.
Сложные типы:
К сложным или структурированным типам относятся массивы, записи, множества, которые требуют специального изучения и здесь рассматриваться не будут.
Задание. Откройте новый файл. Создадим программу, в которой опишем несколько переменных разного типа, введем в них значения и выведем на экран.
| 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. |
Внимательно рассмотрите каждую строчку программы. Обратите особое внимание на описание переменных: Chislo1 — переменная целого типа, Chislo2 — действительного, Simvol — символьного, Stroka — строкового, Logika — логического. Далее в основной программе идет присвоение переменной Chislo1 целого числа 12, переменной Chislo2 — целого числа 24. Обратим внимание, что переменной действительного типа Chislo2 присвоено целое число; никакой ошибки нет, т. к. множество целых чисел является подмножеством множества действительных чисел. Следующая строчка еще более интересная: переменной Chislo2 присваивается значение той же переменной, только деленной на 5.
Такое присваивание используют в программах, если предыдущее значение этой переменной уже не понадобится и для более рационального использования описанных переменных. Для того чтобы переменной символьного типа присвоить какой-либо символ (например, d), надо этот символ записать в одинарных кавычках (знак «’»). Аналогично поступают с переменными строкового типа (смотри следующую строку программы). А про переменные логического типа мы знаем, что им можно присваивать только два значения: True и False. В этой программе мы присвоим значение результата сравнения двух переменных, здесь оно будет равно True. А теперь выведем присвоенные значения на экран.
Задание. Измените значения переменных и проанализируйте результаты выполнения программы. Сохраните программу на дискете под правильным именем в соответствующем каталоге. Распечатайте программу.