- •Предисловие
- •1.1. Общие сведения о программах, лексемах и алфавите языка
- •1.3. Идентификаторы и служебные слова
- •2. Константы: целые, вещественные (с плавающей точкой), перечислимые, символьные (литерные), строковые (строки или литерные строки)
- •3. Операции. Знаки операций. Унарные, бинарные и тернарные операции. Приоритеты операций.
- •3.1 Знаки операций
- •3.2 Унарные операции
- •3.3 Бинарные операции.
- •3.4 Приоритеты операций
- •4. Переменные. Определения и описания. Спецификатор typedef.
- •4.1 Переменные. Определения и описания.
- •4.2 Класс памяти
- •5. Базовые и производные типы данных. Массивы. Указатели, ссылки и адреса. Структуры. Поля битов. Объединения
- •5.1 Массивы
- •5.2 Указатели, ссылки и адреса объектов
- •5.3 Структуры
- •5.3 Поля битов
- •5.4 Объединения
- •6. Операторы
- •6.1 Оператор выражение
- •6.2 Пустой оператор
- •6.3 Составной оператор
- •6.4 Оператор if
- •If (выражение) оператор-1; [else оператор-2;]
- •6.5 Оператор switch
- •6.6 Оператор break
- •6.7 Оператор for
- •6.8 Оператор while
- •6.8 Оператор do while
- •6.9 Оператор continue
- •6.10 Оператор return
- •6.11 Оператор goto
- •7. Функции
- •7.1 Определения, описания и вызовы функций
- •7.2 Начальные (умалчиваемые) значения параметров.
- •7.3 Функции с переменным количеством параметров
- •7.4 Перегрузка функций.
- •7.5 Ссылки и параметры-ссылки.
- •7.6 Шаблоны функций.
- •8. Технологии программирования.
- •8.1 Введение.
- •8.2 Модульное программирование.
- •8.3 Нисходящее программирование.
- •8.4 Структурное программирование.
- •8.5 Понятия объекта, класса объектов.
- •8.6 Основные понятия объектно-ориентированного программирования: инкапсуляция, наследование и полиморфизм.
- •9.1 Тип данных - класс.
- •9.2 Доступность компонентов класса
- •9.3 Конструктор и деструктор
- •9.4 Компоненты-данные и компоненты-функции. Статические и константные компоненты класса
- •10. Указатели на компоненты класса
- •10.1 Указатели на компоненты- данные.
- •10.2 Указатели на компоненты- функции.
- •10.3 Указатель this
- •11. Друзья классов
- •11.1 Дружественная функция
- •11.2 Дружественный класс
- •12. Наследование
- •12.1 Определение производного класса.
- •12.2 Конструкторы и деструкторы производных классов
- •13. Полиморфизм
- •13.1 Виртуальные функции.
- •13.2 Абстрактные классы
- •14. Шаблоны классов
- •15. Перегрузка операций
- •15.1 Общие сведения о перегрузке стандартных операций
- •15.2 Перегрузка унарных операций
- •15.3 Перегрузка бинарных операций
- •15.5 Перегрузка операции вызова функции
- •15.6 Перегрузка операции присваивания
- •15.7 Основные правила перегрузки операций.
- •16. Обработка исключительных ситуаций
- •16.1 Операторы try, throw, catch
- •16.2 Универсальный обработчик исключений
- •17. Структура Windows-приложения
- •17.2 Структура каркасного Windows-приложения
- •17.3 Главная функция WinMain()
- •17.4 Сообщения Windows
- •17.5 Класс окна. Регистрация и его характеристики
- •17.6 Создание и показ окна
- •17.7 Цикл обработки сообщений
- •17.8 Оконная функция
- •17.9 Завершение выполнения приложения
- •18. Препроцессор
- •18.1 Общие пpеобpазования
- •18.2 Директивы Препроцессора
- •18.3 Подключаемые файлы
- •18.4. Директива '#include'.
- •18.5 Однократно подключаемые файлы
- •18.6 Макросы
- •18.7 Стрингификация
- •18.8 Объединение
- •18.9 Удаление макросов
- •18.10 Условия
- •19. Разработка Windows приложений с использованием библиотеки классов mfc (microsoft foundation class library)
- •19.1 Некоторые сведения о программировании Windows-приложений
- •19.2 Преимущества использования mfc
- •19.4 Библиотека mfc
- •20. Простейшие mfc-приложения
- •20.1 Приложение без главного окна
- •20.2 Приложение с главным окном
- •20.3 Обработка окном сообщений
3.4 Приоритеты операций
В языке СИ++ операции с высшими приоритетами вычисляются первыми. Наивысшим приоритетом является приоритет равный 1. Приоритеты и порядок операций приведены в таблице:
Приоритет |
Знак операции |
Типы операции |
Порядок выполнения |
1 |
() [] . -> :: |
Выражение |
Слева направо |
2 |
! ~ + - ++ -- & * (тип) sizeof new delete тип() |
Унарные |
Справа налево |
3 |
.* ->* |
|
Слева направо |
4 |
* / % |
Мультипликативные |
Слева направо |
5 |
+ - |
Аддитивные | |
6 |
<< >> |
Сдвиг | |
7 |
< > <= >= |
Отношение | |
8 |
== != |
Отношение (равенство) | |
9 |
& |
Поразрядное И | |
10 |
^ |
Поразрядное исключающее ИЛИ | |
11 |
| |
Поразрядное ИЛИ | |
12 |
&& |
Логическое И | |
13 |
|| |
Логическое ИЛИ | |
14 |
? : |
Условная | |
15 |
= *= /= %= += -= &= |= >>= <<= ^= |
Простое и составное присваивание |
Справа налево |
16 |
, |
Последовательное вычисление |
Слева направо |
4. Переменные. Определения и описания. Спецификатор typedef.
4.1 Переменные. Определения и описания.
В пособиях по языкам программирования переменную чаще всего определяют как пару "имя" - "значение". Имени соответствует адрес (ссылка) на участок памяти, выделенный переменной, а значением является содержимое этого участка. Именем служит идентификатор, а значение соответствует типу переменной, определяющему множество допустимых значений и набор операций, для которых переменная может служить операндом.
Множество допустимых значений переменной обычно совпадает со множеством допустимых констант того же типа. Таким образом, вводятся вещественные, целые и символьные переменные, причем символьные (char) иногда относят к целым. Целочисленные и вещественные считаются арифметическими типами. Арифметический (включая символьный) тип является частным случаем скалярных типов. К скалярным типам кроме арифметических относятся указатели, ссылки и перечисления.
Переменные типизируются с помощью определений и описаний. Сразу же введем терминологические соглашения. В отличие от описания определение не только вводит объект (например, переменную), но и предполагает, что на основании этого определения компилятор выделит память для объекта (переменной).
Все взаимосвязанные атрибуты объектов (тип, класс памяти, область (сфера) действия имени, видимость, продолжительность существования, тип компоновки) приписываются объекту с помощью определений и описаний, а также контекстом, в котором эти определения и описания появляются. Определения устанавливают атрибуты объектов, резервируют для них память и связывают эти объекты с именами (идентификаторами). Кроме определений, в тексте программы могут присутствовать описания, каждое из которых делает указанные в них идентификаторы известными компилятору. В переводной литературе и особенно в документации наряду с терминами "описание" и "определение" используют "объявление" и "декларация".
Итак, появление двух терминов "определение" и "описание" объясняется тем фактом, что каждый конкретный объект может быть многократно описан, однако в программе должно быть только единственное определение этого объекта. Определение обычно выделяет объекту память и связывает с этим объектом идентификатор – имя объекта, а описания только сообщают свойства того объекта, к которому относится имя. Говорят, что описание ассоциирует тип с именем, а определение, кроме того, задает все другие свойства (объем памяти, внутреннее представление и т.д.) объекта и выполняет его инициализацию. В большинстве случаев описание одновременно является и определением. Однако это не всегда возможно и не всегда требуется. Определять и описывать можно следующие объекты:
• переменные;
• функции;
• классы, их компоненты и указатели на компоненты;
• типы, вводимые пользователем с помощью typedef;
• типы и имена структур, объединений, перечислений;
• компоненты (элементы) структур и объединений;
• массивы объектов заданного типа;
• перечислимые константы;
• метки операторов;
• макросы препроцессора;
• указатели на объекты или функции заданного типа;
• ссылки на объекты или функции заданного типа;
• константы (значения) заданного типа.
Определение переменных заданного типа имеет следующий формат:
[спецафикатор-класа-памяти] [модификатор] тип имя [=инициатор] [,имя [= инициатор] ]...
где
спецификатор класса памяти - (auto, static, extern, register, typedef)
модификатор - const или volatile;
тип- один из основных типов;
имя - идентификатор;
инициатор - необязательный инициализатор, определяющий начальное значение соответствующего объекта.
Для определения и описания переменных основных типов используются следующие ключевые слова, каждое из которых в отдельности может выступать в качестве имени типа:
• char (символьный);
• short (короткий целый);
• int (целый);
• long (длинный целый);
• float (вещественный);
• double (вещественный с удвоенной точностью);
• void (отсутствие значения).
В обозначении типа может использоваться одновременно несколько служебных слов. Например, определение
long double zebra, atop;
вводит переменные с именами zebra и atop вещественного типа повышенной точности, но явно не присваивает этим переменным никаких начальных значений.
Употребляемые как отдельно, так и вместе с другими именами типов служебные слова unsigned (беззнаковый) и signed (знаковый) позволяют для арифметического или символьного типа выбирать способ учета знакового разряда:
unsigned int i, j // Значения от 0 до 65535
unsigned long L, It ,N; // Значения от О до 4294967265
unsigned char с, s; // Значения от 0 до 255
Применение в определениях типов отдельных служебных слов int, char, short, long эквивалентно signed int, signed char, signed short, signed long. Именно поэтому служебное слова signed обычно опускается в определениях и описаниях. Использование при задании типа только одного unsigned эквивалентно unsigned int.
Используя спецификатор typedef, можно в своей программе вводить удобные обозначения для сложных описаний типов. В следующем примере:
typedef unsigned char COD;
COD simbol;
введен новый тип COD - сокращенное обозначение для unsigned char и переменная этого типа simbol, значениями которой являются беззнаковые числа в диапазоне от 0 до 255.
Рассматривая переменные, мы пока использовали базовые (предопределенные целиком или фундаментальные) типы.