Операции сдвига влево и вправо
Для осуществления сдвига последовательности бит влево и вправо применяются соответственно операции «и». Операнд справа от знака операции указывает, на какую величину должны быть сдвинуты биты, задавая тем самым количество бит, "выводимых" из переменной, и число нулевых бит, заполняющих переменную с другой стороны.
Рис. 2.2. Пример установки значений битов в байте.
Например:
unsigned char A = 12; // А = 000011002
А = А « 2; // А = 001100002
А = А » 3; // А = 000011002
Следует учитывать, что при использовании правого сдвига, если самый старший бит равен единице (признак отрицательного числа у переменных со спецификатором signed), некоторые компиляторы могут не "ввести" нули слева. Это связано с тем, что, чтобы избежать подобных ситуаций, рекомендуется преобразовывать операнд операции в беззнаковый тип (unsigned).
Операторы сравнения
Для того чтобы имелась возможность сравнивать между собой значения каких-либо переменных, язык C++ предусматривает так называемые операторы сравнения. Операторы сравнения — бинарные операторы вида:
Операнд1 Оператор__сравнения Операнд2.
К ним относятся следующие операторы:
Таблица 2.6. Операторы сравнения
-
Оператор
Название
<
Меньше
<=
Меньше или равно
>
Больше
>=
Больше или равно
=
Равно
i =
Не равно
В результате работы операторов сравнения возвращается логическое значение true (истина), если проверяемое условие верно, или false (ложь) в противном случае.
Операция "запятая"
Операция "запятая" связывает между собой несколько выражений таким образом, что последние рассматриваются компилятором как единое выражение.
Благодаря использованию данной операции при написании программ достигается высокая эффективность. К примеру, в операторе ветвления if, рассматриваемом ниже, можно в качестве выражения ввести:
if(i = CallFunc(), i > 7)
...
Тогда сначала выполнится вызов функция CallFunc() с присвоением результата переменной i, а затем произойдет сравнение значения i с числом 7.
Еще большей эффективности позволяет достичь использование операции "запятая" в операторе цикла for. Более подробно этот момент будет рассмотрен ниже.
Приоритет и порядок выполнения операций
Как в любой арифметике, в C++ операции выполняются в определенном порядке. Так, например, математические выражения вычисляются слева направо, в то время как оператор присвоения выполняется справа налево.
Для того чтобы компилятор мог разобраться, какое же действие осуществлять первым при выполнении операций, последние обладают важным свойством - приоритетом. В первую очередь выполняются операции с наивысшим приоритетом. В таблице 2.7 приводятся используемые в C++ операции с указанием их приоритета и направления выполнения.
Таблица 2.7.
Операции и приоритеты их выполнения
-
Оператор
Описание
Приоритет, направление
::
Разрешение видимости
16
=>
[]
Индекс массива
16
=>
()
Вызов функции
16
=>
•
Выбор члена структуры или класса
16
=>
->
++
Постфиксный инкремент
15
<=
--
Постфиксный декремент
15
<=
++
Префиксный итфемент
14
<=
--
Префиксный декремент
14
<=
sizeof
sizeof ()
Размер
14
<=
(тип)
Преобразование типа
14
^
Побитовое исключающее ИЛИ
14
<=
!
Логическое НЕ
14
<=
-
Унарный минус
14
<=
+
Унарный плюс
14
<=
&
Получение адреса
14
<=
*
Разыменование
14
<=
new
new [ ]
Создание динамического объекта
14
<=
delete
delete[ ]
Удаление динамического объекта
14
<=
casting
Приведение типа
14
*
Умножение
13
=>
/
Деление
13
=>
%
Остаток от деления
13
=>
+
Сложение
12
=>
-
Вычитание
12
=>
>>
Сдвиг вправо
11
=>
<<
Сдвиг влево
11
=>
<
Меньше
10
=>
<=
Меньше или равно
10
=>
>
Больше
10
=>
>=
Больше или равно
10
=>
==
Равно
9
=>
!=
Неравно
9
=>
&
Побитовое И
8
=>
^
Побитовое исключающее ИЛИ
7
=>
|
Побитовое ИЛИ
6
=>
&&
Логическое И
5
=>
| |
Логическое ИЛИ
4
=>
?:
Условие
3
<=
=
Присваивание
2
<=
*=
Умножение с присваиванием
2
<=
/=
Деление с присваиванием
2
<=
%=
Модуль с присваиванием
2
<=
+=
Сложение с присваиванием
2
<=
-=
Вычитанне с присваиванием
2
<=
«=
Сдвиг влево с присваиванием
2
<=
»=
Сдвиг вправо с присваиванием
2
<=
&=
Побитовое И с присваиванием
2
<=
^=
Исключающее ИЛИ с присваиванием
2
<=
|=
Побитовое ИЛИ с присваиванием
2
<=
throw
Генерация исключения
2
<=
,
Запятая
1
=>
Язык C++ предоставляет программисту возможность самостоятельно задавать порядок выполнения вычислений. С этой целью, как и в математике, операнды группируются при помощи скобок, которые могут быть вложенными друг в друга. Не существует ограничения на вложенность скобок. Приведенный ниже фрагмент иллюстрирует использование скобок для изменения порядка выполнения последовательности арифметических операторов.
#include <iostream.h> int main ()
{
int x = 0, у = 0;
int a = 3, b = 34, с = 82;
х = а * b + с;
у = (а * (b + с) ) ;
cout « "х = " « х « '\n';
cout « "у = " « у « '\n';
return 0;
}
Таким образом, при вычислении значения переменной х сначала будет произведена операнда умножения а на b с последующим сложением с переменной с, тогда как вычисление значения переменной у начнется со сложения переменных b и с с последующим умножением полученной суммы на величину переменной а. Результат работы программы:
х = 184
у = 348