- •Система Pascal abc
- •Редактор
- •Горячие клавиши
- •Окно вывода
- •Окно ввода
- •Запуск и остановка программы
- •Программа прервана пользователем
- •Пошаговое выполнение программы
- •Окно отладки
- •Pascal abc Язык Pascal abc Структура программы
- •Идентификаторы и служебные слова
- •Выражения и операции
- •Арифметические операции
- •Операция @
- •Операции с указателями
- •Операции с множествами
- •Приоритет операций
- •Описание переменных и констант
- •Описание типов
- •Обзор типов
- •Все порядковые типы, а также типы boolean, real и complex называются простыми типами. Порядковые типы
- •Типы boolean, real и complex
- •Строковый тип
- •Массивы
- •Множества
- •Указатели
- •Процедурный тип
- •Эквивалентность типов
- •Неявное приведение типов
- •Явное приведение типов
- •Область действия идентификатора
- •Ввод и вывод. Форматы вывода
- •Оператор присваивания
- •Условный оператор
- •Составной и пустой операторы
- •Оператор выбора
- •Оператор цикла for
- •Оператор цикла repeat
- •Оператор вызова процедуры
- •Операторы break, continue и exit
- •Оператор with
- •Оператор безусловного перехода goto
- •Оператор try ... Except
- •Оператор try ... Finally
- •Оператор raise
- •Описание процедур и функций
- •Параметры процедур и функций
- •Локальные и глобальные переменные
- •Общие стандартные процедуры и функции
- •Стандартные процедуры и функции для работы со строками
- •Стандартные процедуры и функции для работы с файлами
- •Стандартные процедуры и функции для работы с памятью
- •Системные процедуры и функции
- •Стандартные константы
- •Обзор классов и объектов
- •Конструкторы и деструкторы
- •Свойства
- •Переменная Self
- •Наследование
- •Видимость членов класса
- •Переопределение методов
- •Приведение типов объектов
- •Операции is и as
- •Виртуальные методы и полиморфизм
- •Модуль crt
- •Модуль Timers
- •Модуль Sounds
- •Модуль Utils
- •Модуль PointRect
- •Модуль GraphAbc
- •Графические примитивы
- •Цветовые константы и функции для работы с цветом
- •Действия с пером
- •Действия с кистью
- •Действия со шрифтом
- •Действия с рисунками
- •Действия с графическим окном
- •Задание режимов вывода
- •Класс Picture
- •Описатели рисунков и класс Picture
- •Исполнитель Робот
- •Алгоритмизация
- •Алгоритм и его свойства
- •Способы описания алгоритмов
- •Линейные алгоритмы
- •Разветвляющиеся алгоритмы
- •Алгоритмы циклической структуры
- •Подчиненные алгоритмы
- •Системы программирования
- •Лабораторная работа № 1 Программирование линейных алгоритмов
- •Лабораторная работа № 2 Программирование разветвляющихся алгоритмов
- •Лабораторная работа № 4 Одномерные массивы - вектора
- •Литература Основная литература:
- •Дополнительная литература:
- •Лабораторная работа № 3 Программирование циклических алгоритмов
Неявное приведение типов
В операторе присваивания тип переменной в левой части может не совпадать с типом выражения в правой части. Аналогично тип формального параметра, передаваемого по значению, может не совпадать с типом фактического. В этом случае, если возможно, происходит неявное преобразование (приведение) типов.
Типы byte, word и integer неявно преобразуются друг к другу, а также к типам real и complex.
Тип real неявно преобразуется к типу complex.
Интервальный тип и его базовый тип неявно преобразуется друг к другу, неявно преобразуются между собой также интервальные типы, построенные на основе одного базового типа.
Символ неявно преобразуется в строку. Строки разной длины неявно преобразуются друг к другу.
Указатель на любой тип неявно преобразуется к указателю pointer.
Производный класс неявно преобразуется к базовому.
Множество неявно преобразуется к другому множеству, если его базовый тип неявно преобразуется к базовому типу этого другого множества.
Имя процедуры или функции неявно преобразуется к указателю на процедуру или функцию с параметрами тех же типов (у функции должен также совпадать тип возвращаемого значения).
Все возможные неявные преобразования типов проиллюстрированы в программе ImplicitCast.pas.
В процессе выполнения программы после неявного преобразования числовых типов может произойти переполнение. Например, это возможно при преобразовании типа integer в тип byte. Однако, если s1 и s2 - строки и при присваивании s1:=s2 данные строки s2 не умещаются в строку s1, то остаток строки усекается без возникновения ошибки.
Операнды в выражениях также могут иметь разные типы. В этом случае обычно меньший тип неявно приводится к большему или оба типа приводятся к большему. Например, если r имеет тип real, а i - тип integer, то в выражении r+i значение i вначале приводится к типу real, после чего выполняется операция сложения над двумя вещественными значениями. Если строка s1 имеет тип string[30], а s2 - тип string[40], то в выражении s1+s2 обе строки приводятся к типу string и только потом выполняется операция сложения.
Выражения "меньший тип" и "больший тип" в предыдущем абзаце используются в смысле диапазона значений. Например, тип set of 1..9 меньше типа set of byte, но ни один из типов set of 1..9 и set of 5..15 не меньше другого.
Явное приведение типов
Некоторые типы не приводятся к другим неявно, однако такое преобразование имеет смысл. Например, переменную типа char можно преобразовать к значению типа byte, являющемуся кодом символа. Переменную типа integer, содержащую неотрицательное значение, можно преобразовать к интервальному типу, причем, это значение будет выступать номером элемента в порядковом типе.
Для преобразования выражения к новому типу используется конструкция
имя нового типа(выражение)
Например:
type pinteger=^integer; days=(mon,tue,wed,thi,fri,sat,sun); var p: pointer; i: integer; en: days; ... p:=pinteger(@i); i:=integer(en): en:=days(3);
Следует обратить внимание на то, что для явного приведения типов необходимо использовать идентификатор имени типа (т.е. тип должен определяться одним словом). Например, следующая запись является ошибочной:
p:=^integer(@i);
Явные преобразования типов содержат все неявные. Кроме того, все порядковые типы можно явно преобразовывать друг к другу, все порядковые типы можно явно преобразовывать к типам real и complex, базовый класс можно явно преобразовать к производному и указатель pointer можно явно преобразовать к указателю на любой тип.