- •Лексические элементы языка
- •Соглашение об именах
- •Понятие типа данных
- •Определение переменных
- •Правило видимости (scope rules)
- •Классификация типов данных
- •Характеристики базовых типов данных
- •Константные величины
- •Числовые константы
- •Правила определения компилятором констант таковы:
- •Перечислимые константы
- •Символьные (литерные) константы
- •Строковые константы
- •Именованные (символические) константы
- •Преобразования типов Неявные преобразования.
- •Явные преобразования.
- •Примеры явного приведения типов:
- •Пример неявного преобразования типов
- •Процедура подготовки исполняемой программы
- •Пользовательских символических констант
- •Обращение к функциям
Понятие типа данных
Концепцпя типа данных
Данные, с которыми работает программа, хранятся в оперативной памяти. Естественно, что компилятору необходимо точно знать, сколько места они занимают, как именно закодированы и какие действия с ними можно выполнять. Все это задается при описании данных с помощью типа.
Тип данных однозначно определяет:
-
внутреннее представление данных, а следовательно и множество их возможных значений;
-
допустимые действия над данными (операции и функции).
Например, целые и вещественные числа, даже если они занимают одинаковый объем памяти, имеют совершенно разные диапазоны возможных значений.
Каждое выражение в программе имеет определенный тип. Компилятор использует информацию о типе при проверке допустимости описанных в программе действий.
Память, в которой хранятся данные во время выполнения программы, делится на две области: стек (stack) и динамическая область, или хип (heap). Стек используется для хранения величин, память под которые выделяет компилятор, а в динамической области память резервируется и освобождается во время выполнения программы с помощью специальных команд. Основным местом для хранения данных в C# является хип.
Система общих типов CTS
Важно понимать две фундаментальные точки о системе типов в .NET Framework:
-
Она поддерживает принцип наследования. Типы могут быть производными от других типов, которые называются базовыми типами.Производный тип наследует (с некоторыми ограничениями) методы, свойства и другие члены базового типа.Базовый тип, в свою очередь, может быть производным от какого-то другого типа, при этом производный тип наследует члены обоих базовых типов в иерархии наследования.Все типы, включая встроенные числовые типы, например, System.Int32 (ключевое слово C#: int), в конечном счете являются производными от одного базового типа, который является System.Object (ключевое слово C#: объектом). Эта унифицированная иерархия типов называется Система общих типов CTS (CTS).
-
Каждый тип в CTS определен либо как тип значения, либо как ссылочный тип. Сюда включены все пользовательские типы в библиотеке классов платформы .NET Framework, а также собственные пользовательские типы.Типы, определяемые с помощью ключевого слова struct, являются типами значений; все встроенные числовые типы являются structs.Типы, определяемые с помощью ключевого слова class, являются ссылочными типами .Правила времени компиляции и поведение времени выполнения ссылочных типов отличается от правил времени компиляции и поведения времени выполнения типов значений.
К сведениям, хранимым в типе, может относиться следующее:
-
Место для хранения, необходимое для переменной типа.
-
Максимальное и минимальное значения, которые могут быть представлены.
-
Содержащиеся члены (методы, поля, события и т. д.).
-
Базовый тип, которому он наследует.
-
Расположение, в котором будет выделена память для переменных во время выполнения.
-
Разрешенные виды операций.
Давайте рассмотрим, как устроена система типов в языке C++.
В С++ имеются:
-стандартные (встроенные ) типы;
-классы, то есть типы, определяемые пользователем;
-типы, которые можно получить из основных типов и классов (производные типы).
Стандарт языка C++ включает следующий набор фундаментальных типов.
-
Логический тип (bool).
-
Символьный тип (char).
-
Целые типы. Целые типы могут быть одного из трех размеров - short, int, long, сопровождаемые описателем signed или unsigned, который указывает, как интерпретируется значение - со знаком или без оного.
-
Типы с плавающей точкой. Эти типы также могут быть одного из трех размеров - float, double, long double.
Кроме того, в языке есть
-
Тип void, используемый для указания на отсутствие информации.
Язык позволяет конструировать типы.
-
Указатели (например, int* - типизированный указатель на переменную типа int).
-
Ссылки (например, double& - типизированная ссылка на переменную типа double).
-
Массивы (например, char[] - массив элементов типа char).
Язык позволяет конструировать пользовательские типы.
-
Перечислимые типы (enum) для представления значений из конкретного множества.
-
Структуры (struct).
-
Классы (class).
Каждый конкретный тип данных определяется 2-мя факторами:
1) множеством значений, которые могут принимать объекты данного типа;
1а) интерпретирует двоичные коды объектов;
2) внутренне представление данных в компе;
3) набором операций (функций), которые можно применять к данному типу;
3а) контроль типов.
В описании данных должна содержаться (для компилятора) следующая информация, задаваемая типом данных:
-
Имя переменной или константы
-
Размер памяти, необходимой для хранения значений
-
Какие действия можно выполнят с переменной или константой
-
Вид и способ выделения памяти
-
Начальные значения переменной или значение константы
