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

Операции

Операции – это лексемы, обозначающие конкретные вычисления и применяемые к переменным и другим объектам в выражении. Язык С/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

,

Операция «запятая»

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

++

Постфиксный инкремент

--

Постфиксный декремент

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