- •Ю.А Петров Программирование на языке высокого уровня
- •Часть 1
- •Введение
- •Задание
- •Комментарии
- •Идентификаторы
- •Ключевые слова
- •Константы
- •Управляющие последовательности
- •Строковые литералы
- •Константные выражения
- •Пунктуаторы
- •Операции
- •Задание на лабораторную работу 2 разработка программы линейной структуры Цель работы
- •Отчет по лабораторной работе должен содержать:
- •Задание
- •Замечания
- •Варианты заданий
- •Классификация ошибок
- •Ошибки, не обнаруженные компилятором
- •Ситуации, возникающие при неверных результатах
- •Отладка программы
- •Предупреждения
- •Первое сообщение об ошибке
- •Использование команд Find и Replace
- •Быстрое обнаружение ошибочных строк
- •Продолжение отладки
- •Использование встроенного отладчика
- •Разница между командами Step Into и Step Over
- •Дополнительные средства отладки
- •Работа с точками останова
- •Краткая характеристика объектов
- •Формат 1:
- •Стиль программирования
- •Задание на лабораторную работу 4 объекты и их характеристики Цель работы
- •В отчете по лабораторной работе следует представить:
- •5 Структурное программирование
- •Пример1
- •Пример 2
- •Задание на лабораторную работу 5 разработка программы со структурой «развилка» Цель работы
- •Задание:
- •Варианты задания
- •Задание на лабораторную работу 6 создание цикловых программ с фиксированным числом повторений Цель работы
- •Задание
- •Варианты задания
- •Задание на лабораторную работу 7 создание программ с итерационными циклами Цель работы
- •Задание
- •Варианты задания
- •Пояснения к выполнению лабораторной работы 7
- •6 Агрегаты данных
- •Структура
- •Объединения
- •Перечисления
- •Int array[3]; // Объявление определения;
- •Многомерные массивы
- •Вывод в файловый поток
- •Чтение из входного файлового потока
- •Чтение целой строки файлового ввода
- •Определение конца файла
- •Проверка ошибок при выполнении файловых операций
- •Закрытие файла
- •Управление открытием файла
- •Выполнение операций чтения и записи
- •Задание на ргз 1 использование структур данных при решении задач Цель работы
- •Задание
- •Варианты задания
- •7 Модульное программирование
- •Задание на ргз 2 использование модульного программирования при решении задач
- •Перемещаемые панели инструментов
- •Меню File
- •Меню Edit
- •Меню View
- •Меню Insert
- •Меню Project
- •Меню Build
- •Меню Tools
- •Меню Window
- •Список открытых окон
- •Меню Help
- •Приложение 2 Некоторые функции языка с
- •Используемая литература
- •Оглавление
- •5 Структурное программирование 53
Операции
Операции – это лексемы, обозначающие конкретные вычисления и применяемые к переменным и другим объектам в выражении. Язык С/C++ особенно богат операциями, включая не только общие арифметические и логические операции, но также операции манипуляции с двоичными кодами, компонентами структур и объединений и указателями (обращениями по адресу и ссылке).
В языке С++ операции могут быть перегружаемыми и неперегружаемыми. Перегрузка позволяет переопределять действия любой стандартной операции, когда используемые объекты представляют собой класс. Поэтому на данном этапе рассмотрим только неперегружаемые стандартные операции.
В языке С/C++ используются следующие стандартные операции:
[ ] |
() |
. |
– > |
++ |
– – |
& |
* |
+ |
– |
~ |
! |
Sizeof |
/ |
% |
<< |
>> |
< |
> |
<= |
>= |
== |
!= |
^ |
| |
&& |
|| |
?: |
= |
*= |
/= |
%= |
+= |
– = |
<<= |
>>= |
&= |
^= |
|= |
, |
# |
## |
Операции # и ## используются только препpоцессоpом. |
Кроме перечисленных в языке С++ имеются следующие операции:
:: |
.* |
– >* |
Некоторые операции могут иметь более чем одну интерпретацию в зависимости от контекста (таблица 2.2).
Таблица 2.2 – Операции, имеющие более чем одну интерпретацию
Название операции |
Пояснение |
A * B |
Умножение |
*ptr |
Обращение по адресу (ссылка) |
A & B |
Побитовая AND |
&A |
Операция взятия адреса |
int & |
Модификатор ссылки (С++) |
label: |
Метка |
a ? x : y |
Условный оператор |
void func(int n); |
Прототип функции |
a = (b+c)*d |
Изменение приоритета выражения |
a, b, c; |
Выражение с запятыми |
func(a, b, c); |
Вызов функции |
a = ~b; |
Поразрядное отрицание |
~func() {delete a;} |
Деструктор (С++) |
Операции могут быть унарными (с одним) и бинарными (с двумя операндами).
Унарные операции перечислены в таблице (2.3).
Таблица 2.3 – Унарные операции
Название операции |
Пояснение |
Примеры |
& |
Адресная операция |
int i=1,*p=&i;//инициализация указателя |
* |
Операция косвенной адресации |
int j=2; *p=j; // то же, что и i=j |
+ |
Унарный плюс |
i=+1; j=+2 |
– |
Унарный минус |
i= – 1; j= – 2 |
~ |
Побитовое отрицание |
Создает обратный код операнда |
! |
Логическое отрицание |
0 если операнд не 0; 1 если операнд 0 |
++ |
Префикс, постфикс (инкремент) |
++i; /* префикс */ j++; /* постфикс */ |
– – |
Префикс, постфикс (декремент) |
– – i; j – – ; /* декремент */ |
Операция sizeof (операнд) определяет размер в байтах области памяти, занимаемой операндом. Операндом может быть переменная, массив, структура, перечисление и другие объекты.
К бинарным операциям относятся следующие операции (таблица 2.4):
аддитивные;
мультипликативные;
сдвига;
поразрядные;
логические;
присваивания;
сравнения и равенства;
доступа к компонентам;
обращения к функции.
Аддитивные операции (бинарный плюс (сложение) и бинарный минус (вычитание) выполняются со встроенными типами данных (int, short, float, double и т.д.).
К мультипликативным операциям относятся умножение, деление, выделение остатка от деления. Операция / всегда означает деление. Однако если с обеих сторон от нее стоят целые величины (константы, переменные или их комбинации), она выполняет целочисленное деление. Если в результате такого деления получается остаток, С++ его отбрасывает. Операция % означает выделение остатка при целочисленном делении. Эта операция требует, чтобы с обеих сторон от ее знака стояли целые величины.
Таблица 2.4 – Унарные операции
Тип операции |
Название операции |
Обозначение |
Аддитивные |
Бинарный плюс (сложение) |
+ |
Бинарный минус (вычитание) |
- | |
Мультипликативные |
Умножение |
* |
Деление |
/ | |
Выделение остатка от деления |
% | |
Сдвига |
Сдвиг кода влево |
<< |
Сдвиг кода вправо |
>> | |
Поразрядные |
Поразрядное AND |
& |
Поразрядное XOR – исключающее OR |
^ | |
Поразрядное включающее OR |
| | |
Логические |
Логическое AND |
&& |
Логическое OR |
|| | |
Присваивания |
Присваивания |
= |
Умножение с присваиванием |
*= | |
Деление с присваиванием |
/= | |
Остаток от деления с присваиванием |
%= | |
Сложение с присваиванием |
+= | |
Вычитание с присваиванием |
– = | |
Сдвиг влево с присваиванием |
<<= | |
Сдвиг вправо с присваиванием |
>>= | |
Поразрядное AND с присваиванием |
&= | |
Поразрядное XOR с присваиванием |
^= | |
Поразрядное OR с присваиванием |
|= | |
Сравнения и равенства |
Меньше чем |
< |
Больше чем |
> | |
Меньше чем или равно |
<= | |
Больше чем или равно |
>= | |
Равенства |
Равно |
= = |
Не равно |
! = | |
Доступа к компонентам |
Прямой выбор компоненты |
. |
Косвенный выбор компоненты |
– > | |
Члена класса |
Доступ к компоненту класса |
:: |
Прямое обращение через указатель к члену класса |
.* | |
Косвенное обращение через указатель к члену класса |
– >* | |
Условная операция |
"Если а истинно, то х, иначе y |
a ? x : y |
Обращения к функции |
Например, y = sin(x) |
|
Операция запятая |
|
, |
Операции сдвига – сдвиг кода влево, сдвиг кода вправо. При выходе бит из разрядной сетки биты теряются. В языке С++ эти операции могут быть перегружены и при подключении файла iostream.h они используются для ввода/вывода информации.
Поразрядные операции (поразрядное AND, поразрядное XOR – исключающее OR, поразрядное включающее OR) выполняются по следующему правилу:
-
E1
E2
E1&E2
E1^E2
E1|E2
0
0
0
0
0
1
0
0
1
1
0
1
0
1
1
1
1
1
0
1
Например,
a= (a|b)^(a&b)
При a =3, b = 5 имеем: 011 | 101 –
первая скобка равна 111, 011 & 101– вторая скобка равна001.
Общий результат равен
a = 111^001 = 110, т.е.6.
Логическими операциями являются логическое AND и логическое OR. Например, пусть на координатной плоскости x – y (рисунок 2.2) заданы две области (в первом и третьем квадрантах). Точки на осях x, y задаются двумя координатами – x,y (например, 0,4 т.е. x = 0, y = 4 и т.д.).
Выберем произвольно точку с координатами x и y и проверим, попала ли эта точка в заштрихованную область.
Если условие
x >= 0 && y >=4 && y <= 6 || y <= 0 && x >= – 6 && x <= – 4
выполняется, то точка с координатами x и y попала в заштрихованную область.
К операциям присваивания относятся следующие операции:
присваивание;
умножение с присваиванием;
деление с присваиванием;
остаток от деления с присваиванием;
сложение с присваиванием;
вычитание с присваиванием;
сдвиг влево с присваиванием;
сдвиг вправо с присваиванием;
поразрядное AND с присваиванием;
поразрядное XOR с присваиванием;
поразрядное OR с присваиванием.
Составные операции присваиванияинтерпретируются следующим образом. Запись
Е1 операция = Е2;
имеет тот же смысл, что и запись
Е1 = Е1 операция Е2;
Например, запись
E1 += E2
интерпретируется как
E1 = E1 + E2.
В одной строке может стоять больше одной операции присваивания (=), например:
a=b=c=d=100;
Знак =всегда означает: "переменной слева присвоить значение, стоящее справа". Операция выполняется справа налево. Поэтому первой значение100получает переменнаяd, затемс, bиа.
Знак присвоить может стоять даже внутри математического выражения:
x = 5+(r = 9-c);
Здесь сначала переменной rбудет присвоено значение9-с, а затем переменнаяxполучит значение5+9-с;
К операциям сравнения и равенства относятся следующие операции:
меньше чем;
больше чем;
меньше чем или равно;
больше чем или равно.
Операциями равенства являются операции:
равно;
не равно.
Знак = никогда не используется как знак сравнения. В языке C++ нет логического типа. Поэтому, если выражение принимает ненулевое значение, то оно считается истинным, а если принимает нулевое значение – то оно считается ложным;
К операциям доступа к компонентам относятся следующие операции:
прямой выбор компоненты;
косвенный выбор компоненты.
К операциям члена класса относятся следующие операции:
доступ к компоненту класса;
прямое обращение через указатель к члену класса;
косвенное обращение через указатель к члену класса.
Условной операцией является операция
a ? x : y; "если а истинно, то х, иначе y"
Например:
ans = (а>b) ? (a):(b);
Операция «запятая» (,) не работает непосредственно с данными, а приводит к вычислению выражения слева направо. Эта операция дает возможность использовать в одной строке несколько выражений, разделенных запятой. Например:
int main()
{
int i = 10, j = 25; // Используется операция “запятая”
return 0;
}
или
i = 10;
j = (i = 12, i+8); // Результат выполнения: j=20
Сначала i получит значение 10, затем использование операции "запятая" приведет к тому, что i получит значение 12, а затем значение i+8, т.е. 12+8=20. Этот результат будет присвоен j;
Операцией обращения к функции является, например:
y = sin(x) ).
Приведем приоритеты операций (таблица 2.5), начиная с высшего (1) и кончая низшим (15) приоритетом:
Таблица 2.5 – Приоритеты операций
Приоритет |
Операция |
Описание |
Порядок выполнения |
1 |
++ |
Префиксный инкремент |
Слева направо |
-- |
Префиксный декремент | ||
( ) |
Вызов функции, выделение выражения, преобразование типа | ||
[ ] |
Доступ к элементу массива | ||
-> |
Косвенный доступ к элементу структуры | ||
. |
Прямой доступ к элементу структуры | ||
2 |
! |
Логическое отрицание |
Справа налево |
~ |
Порязрядное логическое НЕ (обратный код) | ||
- |
Унарный минус | ||
+ |
Унарный плюс | ||
(type) |
Преобразование к типу type | ||
* |
Выбор значения, содержащееся в памяти, на которое указывает указатель | ||
& |
Взять адрес объекта | ||
sizeof ( ) |
Определение размера в байтах объекта, указанного в скобках | ||
new, delete |
Работа с динамической памятью | ||
3 |
* |
Умножение |
Слева направо |
/ |
Деление | ||
% |
Выделение остатка от деления целых чисел | ||
4 |
+ |
Сложение |
Слева направо |
- |
Вычитание | ||
5 |
<< |
Поразрядный сдвиг кода влево |
Слева направо |
>> |
Поразрядный сдвиг кода вправо | ||
6 |
< |
Меньше |
Слева направо |
<= |
Меньше или равно | ||
> |
Больше | ||
>= |
Больше или равно | ||
7 |
= = |
Равно |
Слева направо |
!= |
Не равно | ||
8 |
& |
Поразрядное логическое «И» |
Слева направо |
9 |
^ |
Поразрядное исключающее «ИЛИ» (XOR) |
Слева направо |
10 |
| |
Поразрядное логическое «ИЛИ» |
Слева направо |
11 |
&& |
Логическое «И» |
Слева направо |
12 |
|| |
Логическое «ИЛИ» |
Слева направо |
13 |
?: |
Условная операция |
Слева направо |
14 |
= |
Присваивание |
Слева направо |
+= |
Сложение с присваиванием | ||
-= |
Вычитание с присваиванием | ||
*= |
Умножение с присваиванием | ||
/= |
Деление с присваиванием |
Окончание таблицы 2.5
Приоритет |
Операция |
Описание |
Порядок выполнения |
14 |
%= |
Определение остатка от деления с присваиванием |
Слева направо |
<<= |
Сдвиг влево с присваиванием | ||
>>= |
Сдвиг вправо с присваиванием | ||
&= |
Поразрядное логическое И с присваиванием | ||
^= |
Поразрядное исключающее ИЛИ с присваиванием | ||
|= |
Поразрядное логическое ИЛИ с присваиванием | ||
15 |
, |
Операция «запятая» |
Слева направо |
++ |
Постфиксный инкремент | ||
-- |
Постфиксный декремент |
Префиксный и постфиксные операции различаются приоритетом. Префиксные операции имеют самый большой приоритет и выполняются до любой другой операции. Постфиксные операции имею самый маленький приоритет и выполняются после всех остальных операций.