- •Предисловие
- •Глава 1. Основные понятия
- •1.1. Элементы языка программирования
- •1.2. Процесс создания программы
- •1.3. Первая программа
- •1.4. Состав программы
- •Глава 2. Средства разработки на C++
- •2.1. Системы Turbo C++ 3.0/Borland C++ 3.1
- •2.2. Система C++ Builder
- •Глава 3. Работа с числовыми данными
- •3.1. Целые типы
- •3.2. Числа с плавающей точкой
- •3.3. Ввод и вывод чисел
- •3.4. Логический тип и логические операции
- •3.5. Математические функции
- •Глава 4. Операторы. Ключевые слова
- •4.1. Операторы
- •4.2. Приоритеты операторов
- •4.3. Ключевые слова
- •4.4. Структура программы
- •4.5. Константы
- •Задачи - . Простейшие вычисления
- •Глава 5. Управление и циклы
- •5.1. Условный оператор
- •5.2. Операторы цикла
- •5.3. Переключатель
- •5.4. Операторы break и continue
- •Задачи -. Выбор и циклы
- •Глава 6. Массивы
- •6.1. Одномерные массивы
- •6.2. Двумерные массивы
- •Задачи -. Одно- и двумерные массивы
- •Глава 7. Функции
- •7.1. Определение функции
- •7.2. Формальные параметры и фактические аргументы
- •7.3. Автоматические и статические переменные
- •7.4. Прототипы функций
- •7.5. Массивы как аргументы функций
- •7.6. Внешние переменные
- •7.7. Рекурсия
- •7.8. Перегруженные имена функций
- •7.9. Аргументы функций по умолчанию
- •Задачи -. Функции
- •Глава 8. Символы и строки
- •8.1. Символы
- •8.2. Строки символов
- •Задачи -. Символы и строки
- •Глава 9. Препроцессор
- •9.1. Директивы препроцессора
- •9.2. Макросы
- •Задачи -. Макросы
- •Глава 10. Указатели и ссылки
- •10.1. Указатели и адреса
- •10.2. Указатели и массивы
- •10.3. Адресная арифметика
- •10.4. Символьные указатели
- •10.5. Массивы указателей
- •10.6. Указатели на функции
- •10.7. Ссылки
- •10.8. Операторы new и delete
- •Задачи -. Указатели и ссылки
- •Глава 11. О файлах и командной строке
- •11.1. Знакомство с файлами
- •11.2. Командная строка
- •11.3. Перенаправление стандартного ввода и вывода на файл
- •11.4. Аргументы командной строки
- •Задачи -. Файлы и командная строка
- •Глава 12. Работа с экраном дисплея
- •12.1. Текстовый режим
- •12.2. Графический режим
- •Задачи -. Работа с экраном
- •Глава 13. Внутреннее представление чисел
- •13.1. Двоичная система счисления
- •13.2. Беззнаковые целые
- •13.3. Двоичный дополнительный код
- •13.4. Двоичный код с избытком
- •13.5. Побитовые операторы
- •13.6. Дробные числа в двоичной системе
- •13.7. Внутреннее представление плавающих типов
- •13.8. Преобразование типов
- •Задачи -. Побитовые операторы
- •Глава 14. Структуры, перечисления, объединения
- •14.1. Объявление структур
- •14.2. Структуры и функции
- •14.3. Указатели на структуры
- •14.4. Массивы структур
- •14.5. Перечисления
- •14.6. Объединения
- •14.7. Битовые поля
- •14.8. О бинарных файлах
- •Задачи -. Структуры
- •Глава 15. Классы
- •15.1. Структуры в C++. Инкапсуляция
- •15.2. Встроенные функции
- •15.3. Классы. Скрытие данных
- •15.4. Конструкторы
- •15.5. Статические члены класса
- •15.6. Друзья класса
- •15.7. Копирование объектов класса
- •15.8. Управление доступом
- •15.9. Ссылка на себя
- •15.10. Деструкторы
- •Задачи -. Работа с классами
- •Глава 16. Программы из нескольких файлов
- •16.1. Работа с проектами
- •16.2. Область действия имен
- •16.3. Заголовочные файлы
- •16.4. Пространства имен
- •Задачи -. Работа со стеком
- •Глава 17. Перегрузка операторов
- •17.1. Правила перегрузки операторов
- •Задачи -. Перегрузка операторов
- •Глава 18. Конструктор копирования и оператор присваивания
- •18.1. Проблемы при копировании
- •Задачи -. Конструктор копирования
- •Глава 19. Ввод и вывод
- •19.1. Вывод
- •19.2. Ввод
- •19.3. Ввод и вывод определяемых пользователем типов
- •19.4. Работа с файлами
- •Глава 20. Взаимоотношения классов
- •20.1. Объекты как члены класса
- •20.2. Конструкторы встроенных типов
- •20.3. Наследование
- •20.4. Виртуальные функции
- •20.5. Абстрактные классы
- •20.6. Совместимость типов
- •20.7. Множественное наследование
- •Задачи -. Наследование классов
- •Глава 21. Шаблоны, исключения
- •21.1. Шаблоны
- •21.2. Шаблоны функций
- •21.3. Классы и шаблоны
- •21.4. Обработка исключений
- •21.5. Стандартная библиотека шаблонов
- •Литература
- •Предметный указатель
52
Глава 4. Операторы. Ключевые слова
Ниже приведен справочный материал по языку C++.
4.1. Операторы
Операторы выполняют действия, например, производят сложение двух чисел. Операторы различаются числом операндов, участвующих в соответствующей операции. Существуют унарные, бинарные операторы, а также единственный оператор с тремя операндами.
Арифметические операторы языка C++, такие как сложение, умножение, похожи на соответствующие математические действия. Но есть операторы, не имеющие прямой аналогии в математике, например, вызов функции (), доступ к элементу массива [].
Унарные операторы
В табл.15 перечислены имеющиеся в языке одноместные (унарные) операторы, которые применяются к единственному операнду.
Таблица 16. Унарные операторы
Знак |
Операция |
Пример |
Значение |
оператора |
|
выражения |
выражения |
– |
Унарный минус |
-(-1) |
1 |
+ |
Унарный плюс |
+(-1) |
-1 |
~ |
Побитовое логическое отрицание |
~(0) |
-1 |
! |
Логическое отрицание |
!(0) |
1 |
sizeof |
Размер объекта в байтах |
sizeof(char) |
1 |
(тип) |
Приведение типа |
(int)1.0 |
1 |
тип() |
|
int(1.0) |
1 |
* |
Доступ к объекту по указателю |
*p |
|
& |
Вычисление адреса |
&x |
адрес x |
new |
Выделение памяти |
p=new char |
|
delete |
Освобождение памяти |
delete p |
|
++ |
Увеличение на единицу |
++k; k++ |
|
–– |
Уменьшение на единицу |
– – k, k– – |
|
Оператор ++ увеличивает свой операнд на 1, а оператор – – уменьшает на 1. Данные операторы могут быть префиксными (приставочными) и постфиксными (суффиксными). Если оператор стоит
перед операндом, то сначала изменяется значение операнда, а затем измененное значение используется в вычислениях, например,
|
Операторы. Ключевые слова 53 |
int i = 1, j = 1, n, m; |
|
n = ++i; |
// i = 2, n = 2 |
Если оператор стоит после операнда, то в вычислениях
используется начальное значение операнда, а затем его значение изменяется, например,
m = j– – ; // m = 1, j = 0
Бинарные операторы
В табл.17 перечислены двухместные (бинарные) операторы, требующие двух операндов. Операторы арифметические, логические и сравнения уже обсуждались. Побитовые операторы применимы к целым типам и действуют на отдельные разряды их двоичного представления, подробнее они будут рассмотрены ниже (см. §13.5).
Таблица 18. Бинарные операторы
Знак |
Операция |
Пример |
Значение |
оператора |
|
выражения |
выражения |
* |
Умножение |
(–1) * (–1) |
1 |
/ |
Деление |
3 / 2 |
1 |
|
|
3.0 / 2.0 |
1.5 |
% |
Вычисление остатка |
3 % 2 |
1 |
+ |
Сложение |
3 + 2 |
5 |
– |
Вычитание |
3 – 2 |
1 |
< |
Меньше |
3 < 2 |
0 |
> |
Больше |
3 > 2 |
1 |
<= |
Меньше или равно |
3 <= 2 |
0 |
>= |
Больше или равно |
3 >= 2 |
1 |
== |
Тождество |
3 == 2 |
0 |
!= |
Не равно |
3 != 2 |
1 |
<< |
Сдвиг влево |
3 << 2 |
12 |
>> |
Сдвиг вправо |
7 >> 2 |
1 |
& |
Побитовое И |
3 & 2 |
2 |
| |
Побитовое ИЛИ |
3 | 2 |
3 |
^ |
Побитовое |
3 ^2 |
1 |
|
исключающее ИЛИ |
|
|
&& |
Логическое И |
3 && 2 |
1 |
|| |
Логическое ИЛИ |
3 || 2 |
1 |
, |
Запятая |
(1, 2, 2+1) |
3 |
Оператор запятая
Рассмотрим здесь оператор запятая. Несколько выражений, разделенных запятыми, вычисляются слева направо и рассматриваются
54 4
как одно выражение. Типом и значением результата является тип и значение правого выражения. Примеры использования оператора запятая будут приведены ниже.
Запятые, разделяющие аргументы функций и переменные в описаниях, операторами не являются и не обеспечивают вычисления слева направо.
Условное выражение
Оператор условного выражения – единственный, требующий трех операндов. Для его обозначения используются знак вопроса и двоеточие (? :). Условное выражение имеет вид:
a ? b : c;
Если a есть истина (не нуль), то результатом всего выражения будет значение выражения b, иначе результатом будет значение выражения c. Например, в следующей инструкции переменной max присваивается максимум из x и y:
max = x > y ? x : y;
Операторы присваивания
В языке C++, кроме обычного оператора присваивания, обозначаемого одним знаком =, существуют операторы присваивания, совмещенные с основными операциями, табл. 19. Они позволяют писать инструкции вида:
a = a + b;
в более краткой форме a+= b;
Таблица 19. Операторы присваивания
Знак |
Выполняемое действие |
Примеры |
Значе- |
оператора |
|
выражений |
ние k |
= |
Простое присваивание |
k = 2 |
2 |
+= |
Сложение и присваивание |
k+=2 |
4 |
–= |
Вычитание и присваивание |
k–=2 |
2 |
*= |
Умножение и присваивание |
k*=3 |
6 |
/= |
Деление и присваивание |
k/=2 |
3 |
%= |
Вычисление остатка и присваивание |
k%=2 |
1 |
<<= |
Сдвиг влево и присваивание |
k<<=2 |
4 |
>>= |
Сдвиг вправо и присваивание |
k>>=2 |
1 |
&= |
Побитовое И и присваивание |
k&=2 |
0 |
|= |
Побитовое ИЛИ и присваивание |
k|=2 |
2 |
^= |
Побитовое исключающее ИЛИ и |
k^=2 |
0 |
|
присваивание |
|
|
Операторы. Ключевые слова 55
4.2. Приоритеты операторов
В языке C++ операторы выполняются в очередности, определяемой их приоритетом. Всего существует 16 приоритетов операторов. В табл.20 перечислены операторы в порядке убывания их приоритетов.
Таблица 20. Приоритеты и порядок выполнения операторов
Прио- |
Знаки операторов |
Тип операторов |
Порядок вы- |
ритет |
|
|
полнения |
1() [] . -> Вызов функции, выбор Слева направо
|
|
|
|
|
|
элемента массива, |
|
|
|
|
|
|
|
|
доступ к члену |
|
|
|
|
|
|
|
|
структуры |
|
|
|
2 |
– ~ ! |
* |
& |
++ |
Одноместные с одним |
Справа налево |
|
|
|
–– sizeof |
(тип) |
тип() |
операндом |
|
|
|
|
3 |
.* |
->* |
|
Доступ к члену класса |
Слева направо |
|
|
|
|
|
|
|
|
через указатель |
|
|
|
4 |
* |
/ |
% |
Умножение, деление, |
Слева направо |
|
|
|
|
|
|
|
|
остаток от деления |
|
|
|
5 |
+ |
|
– |
|
Сложение, вычитание |
Слева направо |
|
|
6 |
<< >> |
|
Сдвиг влево и вправо |
Слева направо |
|
||
|
7 |
< > <= >= |
Отношение |
Слева направо |
|
|||
|
|
|
|
|
|
(неравенство) |
|
|
|
8 |
== |
|
!= |
|
Отношение (равно, не |
Слева направо |
|
|
|
|
|
|
|
равно) |
|
|
|
9 |
|
& |
|
|
Побитовое И |
Слева направо |
|
|
10 |
|
^ |
|
|
Побитовое |
Слева направо |
|
|
|
|
|
|
|
исключающее ИЛИ |
|
|
|
11 |
|
| |
|
|
Побитовое ИЛИ |
Слева направо |
|
|
12 |
&& |
|
|
Логическое И |
Слева направо |
|
|
|
13 |
|
|| |
|
|
Логическое ИЛИ |
Слева направо |
|
|
14 |
? : |
|
|
Условная |
Справа налево |
|
|
|
15 |
= *= /= %= += -= |
Простое и составное |
Справа налево |
|
|||
|
|
<<= >>= &= |= ^= |
присваивание |
|
|
|||
|
16 |
|
, |
|
|
Последовательное |
Слева направо |
|
|
|
|
|
|
|
вычисление |
|
|
При вычислении выражений сначала выполняются операторы, заключенные в самые внутренние круглые скобки. Если скобок нет, то сначала выполняются операторы с более высоким приоритетом. В случае одинакового приоритета операторы выполняются либо слева направо, либо справа налево. Например, арифметические операторы выполняются
слева направо. Инструкция a = b + c + d + e;