Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекций по программированию и алгоритмизаци...doc
Скачиваний:
31
Добавлен:
05.09.2019
Размер:
2.24 Mб
Скачать

Операции выбора компонентов структурированного объекта

К операциям выбора компонентов структурированного объекта относятся:

. Операция прямого выбора – точка

-> Операция косвенного выбора

Об этих операциях будет сказано позже, после определения понятия класса и объекта-представителя класса.

Операции обращения к компонентам класса

К операциям обращения к компонентам класса относятся:

. Операция обращения к компоненте класса по имени объекта или ссылки на объект (левый операнд операции) и указателю на компоненту класса (правый операнд операции). Например, student.year_birthday.

-> Операция обращения к компоненте класса по указателю на объект (левый операнд операции) и указателю на компоненту класса (правый операнд операции). Например, student->year_birthday.

:: Операция доступа к компоненте класса по имени класса и имени компоненты. Например, student::year_birthday.

Операция управления процессом вычисления значений

, Операция запятая. Например, A &= B, A * B, -A.

Группирует выражения слева направо. Разделённые запятыми выражения вычисляются последовательно слева направо, в качестве результата сохраняются тип и значение самого правого выражения.

Эта операция формально также является бинарной операцией, хотя опе­ранды этой операции абсолютно не связаны между собой.

Операция вызова функции

() Операция вызова. Например, sin(x).

Играет роль бинарной операции при вызове функции. Левый операнд представляет собой выражение, значением которого является адрес функции. Правый операнд является разделённым запятыми списком выражений, определяющих значения параметров.

Операция явного преобразования типа

() Операция преобразования (или приведения) типа

Эта бинарная операция в контексте так называемого постфиксного выражения и в контексте выражения приведения обеспечивает изменение типа значения выражения, представляемого вторым операндом. Информация о типе, к которому преобразуется значение второго операнда, кодируется первым выражением, которое является спецификатором типа. Существуют две формы операции преобразования типа: каноническая, при которой в скобки заключается первый операнд (в выражениях приведения), и функциональная (в постфиксных выражениях), при которой в скобки заключается второй операнд. При функциональной форме операции преобразования типа спецификатор типа представляется одним идентификатором. Для приведения значения к типу unsigned long следует использовать лишь каноническую форму операции преобразования.

Операция индексации

[] Операция индексации. Например, a [4];

Играет роль бинарной операции при индексации элементов массива. Левый операнд представляет собой выражение, значением которого является адрес первого элемента массива. Правый операнд является выражением, определяющим значение индекса, т.е. смещения относительно первого элемента массива.

Операция с тремя операндами

?: Условная операция. Например, (x < 10)? x = 25: x++

Единственная в C++ операция с тремя операндами. Первое выражение-операнд располагается слева от знака ?, второе выражение-операнд располагается между знаками ? и :, третье выражение-операнд - справа от знака :. Выполнение условной операции начинается с вычисления значения самого левого операнда. Если его значение оказывается отличным от 0, то вычисляется значение второго операнда, которое и становится значением выражения. Если значение первого операнда оказывается равным 0, то вычисляется значение третьего операнда, и тогда это значение становится значением выражения.

Операция typeid обеспечивает динамическую идентификацию типов.

Операции и их приоритеты сведены в таблице 5.

Таблица 5

Приоритеты операций

Вес

Знак

Наименование операции

Тип

операции

Порядок

1

( )

[]

.

->

вызов функции

выделение элемента массива

выделение элемента структуры или объединения

выделение элемента структуры или объединения, адресуемой (го) указателем

Выражение

Слева направо

2

!

~

-

++

--

&

*

(тип)

sizeof

логическое отрицание

побитовое отрицание

изменение знака (унарный минус)

увеличение на единицу (инкремент)

уменьшение на единицу (декремент)

определение адреса

обращение по адресу

преобразование типа

определение размера в байтах

унарные

Справа налево

3

*

/

%

умножение

деление

определение остатка от деления по модулю

бинарные

арифмети-ческие

Слева направо

4

+

-

сложение

вычитание

бинарные

арифмет.

Слева направо

5

<<

>>

сдвиг влево

сдвиг вправо

сдвига

Слева направо

Вес

Знак

Наименование операции

Тип

операции

Порядок

6

<

<=

>

>=

меньше чем

меньше или равно

больше чем

больше или равно

отношения

Слева направо

7

==

!=

равно

неравно

отношения

Слева направо

8

&

побитовая операция "И"

поразрядная

Слева направо

9

^

побитовая «исключающее "ИЛИ"»

поразрядная

Слева направо

Продолжение табл. 5

Вес

Знак

Наименование операции

Тип

операции

Порядок

10

|

побитовая "ИЛИ"

поразрядная

Слева направо

11

&&

логическая операция "И"

логическая

Слева направо

12

||

логическая операция "ИЛИ"

логическая

Слева направо

13

? :

условная операция

тернарная

Справа налево

14

=

+=

-=

*=

/=

%=

<<=

>>=

&=

|=

^=

простое присваивание

сложение с присваиванием

вычитание с присваиванием

умножение с присваиванием

деление с присваиванием

выделение остатка от деления с при- сваиванием

сдвиг двоичного числа влево с присваиванием

сдвиг двоичного числа вправо с присваиванием

побитовая операция "И" с присваиванием

поразрядная операция "ИЛИ" c присваиванием

исключающее "или" с присваиванием

присваи-вания

бинарные

(для двоичных операндов)

Справа налево

15

,

операция "запятая" (соединения)

Бинарная

Слева направо

4.4. Операторы языка С++

Каждый оператор в языке должен заканчиваться точкой с запятой (;). Часто в качестве оператора выступает выражение. Выражением может служить и вызов функции, не возвращающей никакого значения. Чаще всего оператор-выражение – это выражение присваивания. В С++ нет отдельного оператора присваивания, только операция.

Пустой оператор. Его синтаксис ;

Этот оператор используется там, где по синтаксису языка требуется оператор, а по смыслу программы никакие действия не выполняются.

Составные операторы и блоки. В ряде синтаксических конструкций языка можно задавать только один оператор, а логика программы требует нескольких. В этом случае могут использоваться составные операторы.

Составной оператор – это последовательность операторов, заключенная в фи­гурные скобки. Составной оператор может встречаться в программе везде, где может быть отдельный оператор. После правой закрывающей фигурной скобки в конце блока точка с запятой не ставится.

Если среди операторов в составном операторе имеются определения и описания, то такой составной оператор называется блоком.

Блок и составной оператор пользуются всеми правами операторов и могут вкладываться друг в друга. На глубину вложенности язык не накладывает ограничений.

Управляющие операторы можно разделить на три категории:

  1. Условные операторы if, if – else и switch и оператор безусловного перехода goto.

  2. Операторы цикла for, while и do – while.

1. Условные операторы

Оператор ветвления записывается следующим способом:

if (<выражение>) <оператор 1;>

else (<оператор 2>);

Существует два варианта оператора if: так называемые полная и краткая формы. Полная форма этого оператора приведена выше. Если значение условия «истинно», то выполняется оператор 1 (им может быть составной оператор - блок), следующий за условием. Если же условие принимает значение "ложно", то выполняется оператор 2, следующий за ключевым словом else.

В записи оператора if вторая часть (т. е. оператор else) может отсутствовать (краткая форма):

if (<выражение>) <оператор;>

Тогда, если условие принимает значение «ложно», выполняется сразу следующий оператор программы. В языке С++, как уже упоминалось, нет логического типа, поэтому в качестве условия может стоять произвольное выражение. В операторе if лишь проверяется, является ли значение этого выражения ненулевым (истинным) или нулевым (ложным). С помощью оператора if можно, например, вычислить значение функции sgn(x) – знак х. Функция sgn(x) принимает значение 1, если х > 0, значение -1, если х < 0, значение 0, если х = 0.

Пример: a) if (k != 0) k = k+1; b) if (k) k++;

else k = k-1; else k--;

Часто встречается необходимость использовать конструкцию if-else-if:

if (<выражение>) <оператор 1;>

else if (<оператор 2>);

else if (<оператор n>);

else (<оператор n+1>);

В этой форме условия операторов if проверяются сверху вниз. Как только ка­кое-либо из условий принимает значение «истинно», выполнится оператор, следующий за этим условием, а вся остальная часть конструкции будет проигнорирована.

Оператор множественного выбора имеет следующий синтаксис:

switch ( <выражение> ) {

case <консатнта1> : <группа операторов1>;

case <консатнта2> : <группа операторов2>;

...

case <консатнтаN> : <группа операторовN>;

default : <операторы>;

};

Метки определяют точки входа в тело оператора. Чтобы выполнить только одно действие, необходимо предусмотреть выход (оператор break) из данного оператора в нужном месте.

Сначала вычисляется выражение в скобках за ключевым словом switch. Затем просматривается список меток (case constant 1 ит. д.) до тех пор, пока не находится метка, соответствующая значению вычисленного выражения. Далее происходит выполнение соответствующей последовательности операторов, следующих за двоеточием. Если же значение выражения не соответствует ни одной из меток оператора switch, то выполняется последовательность операторов, следующая за ключевым словом default.

Допускается конструкция оператора switch, когда слово default и соответствующая последовательность операторов могут отсутствовать.

Выполнение оператора break приводит к выходу из оператора switch и пере­ходу к следующему оператору программы (см. пример). Наличие оператора break в операторе switch необязательно.

Пример:

switch (operand) {

case 1: x *= y; break;

case 2: x /= y; break;

case 3: x += y; break;

case 4: x -= y; break;

case 5: x++;

case 6: x++; break;

case 7:

case 8:

case 9: printf("Not done\n"); break;

default: printf("Bug!\n");

exit(1);

}

Оператор безусловного перехода goto имеет следующий синтаксис:

goto <идентификатор-метка>;

Язык С обладает всеми возможностями для написания хорошо структурированных программ. Апологеты структурного программирования считают дурным тоном использование оператора goto, без которого было тяжело обойтись в таких языках, как FORTRAN или BASIC. Тем не менее оператор goto в языке С есть, и иногда он может быть полезен, хотя без него можно обойтись в любой ситуации. Для использования оператора goto надо ввести понятие метки (label). Метка – это идентификатор, за которым следует двоеточие. Метка должна находиться в той же функции, что и оператор goto. Одно из полезных применений оператора goto – это выход из вложенных циклов.

2. Операторы цикла

Циклы необходимы, когда нам надо повторить некоторые действия несколько раз, как правило, пока выполняется некоторое условие. В языке С известно три вида оператора цикла:

1) итерационный цикл (for (инициализация; выражение_условие; список_выражений;) тело_цикла;

  1. цикл с предусловием (while (выражение_условие) тело_цикла;)

  2. цикл с постусловием (do тело_цикла while(выражение_условие;).

Тело_цикла не может быть описанием или определением. Это либо отдельный оператор (в том числе и пустой), либо составной оператор, либо блок.

Оператор цикла со счетчиком (итерационный цикл):

for (<выражение инициализации>;<выражение условие>;<выражение модификации>) <оператор>;

где <выражение инициализации> - выражение инициализации параметра цикла, <выражение модификации> - изменение параметра цикла,

Инициализация – последовательность определений и выражений, разделенных запятыми (если принять во внимание, что запятая есть операция, то можно говорить о выражении вообще). Все они выполняются только 1 раз при входе в цикл. В простейшей форме инициализация используется для присвоения начального значения параметру цикла.

Выражение условие – обычно выражение, которое определяет, когда цикл должен быть завершен: завершение цикла происходит при нарушении истинности этого выражения (как уже говорилось, истиной в языке, считается любое ненулевое значение).

Выражения модификации – состоит из выражений, разделенных запятыми. Эти выражения вычисляются на каждой итерации после выполнения тела цикла и до следующей проверки выражения условия.

Эти три раздела заголовка цикла должны быть разделены точкой с запятой. Выполнение цикла происходит до тех пор, пока условное выражение истинно. Как только условие становится ложным, начинает выполняться следующий за циклом for оператор.

Пример: for (i=0; i<100; i++) sum += x[i]; // sum=sum+x[i];

Оператор цикла с предусловием:

while ( <выражение условие> ) <оператор>;

Оператор может быть простым, составным или пустым оператором. Цикл выпол­няется до тех пор, пока условие принимает значение «истинно» (т.е. отлично от ну­ля). Когда же условие примет значение «ложно», программа передаст управление следующему оператору программы. Так же, как и в цикле for, в цикле while сначала проверяется условие, а затем выполняется оператор – это, так называемый, цикл с предусловием. Тип «условия» должен быть арифметическим или приводимым к нему.

Пример: while (i<100) p++;

Оператор цикла с постусловием

В отличие от предыдущих циклов в цикле do - while условие проверяется в конце оператора цикла.

do {<операторы>} while ( <условие выполнения> );

Пример: do {

n *= i;

i++;

}

while (i <= 100);

Сначала выполняется последовательность операторов, составляющая тело цикла, а затем вычисляется выражение. Если оно истинно (не равно нулю), тело цикла выполняется еще раз. Фигурные скобки необязательны, если внутри них находится один оператор. Тем не менее, они чаще всего ставятся для лучшей читаемости программы, а также чтобы не спутать (программисту, а не компилятору) этот цикл с оператором while.

Оператор do-while называется оператором цикла с постусловием. Какое бы условие ни стояло в конце оператора, набор операторов в фигурных скобках один (первый) раз выполнится обязательно. В циклах for и while оператор может не выполниться ни разу.