ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4231
Скачиваний: 28
Глава 3. Операторы и выражения
41
Например:
int x = 11, y = 3, z;
z = x % y; /* z = 2 */
Отметим, что операндами арифметических операторов могут
быть как переменные, так и литералы арифметических типов, а
результатом является R-value.
3.3. Побитовые операторы
Над данными интегрального типа определены следующие
поби-
товые операторы
:
<<
— бинарный оператор сдвига влево;
>>
— бинарный оператор сдвига вправо;
~
— унарный оператор дополнения до 1 или отрицания;
&
— бинарный побитовый оператор И;
|
— бинарный побитовый оператор ИЛИ;
^
— бинарный побитовый оператор исключающее ИЛИ.
Операндами побитовых операторов могут быть как переменные,
так и литералы, а результатом является R-value. Опишем подроб-
нее работу побитовых операторов.
Побитовая операция
x<<n
сдвигает двоичное представление числа
x
на
n
разрядов влево. При этом биты, освобождающиеся справа,
заполняются нулями. Например,
short x = 0x0001, y;
y = x << 1; /* y = 0x0002 */
Отметим, что оператор левого сдвига не обеспечивает обработку
ситуации переполнения левого операнда. В случае если перепол-
нения нет, то сдвиг влево на один разряд эквивалентен умноже-
нию левого операнда на 2.
Побитовая операция
x>>n
сдвигает двоичное представление числа
x
на
n
разрядов вправо. Если число без знака, то освобождающие-
ся слева биты заполняются нулями. Если же число
x
имеет знак,
Часть I. Язык программирования С
42
то освобождающиеся слева биты заполняются копией знакового
бита. Например:
short x = 0x0004, y;
y = x >> 2; /* y = 0x0001 */
Сдвиг вправо на один бит эквивалентен делению левого операнда
на 2.
Если второй операнд оператора сдвига является отрицательным
числом, то результат оператора сдвига не определен.
Побитовая операция
~x
инвертирует битовое представление чис-
ла
x
. То есть над битами числа
x
выполняются следующие преоб-
разования:
~0 = 1
;
~1 = 0
.
Например:
short x = 0x000F, y;
y = ~x; /* y = 0xFFF0 */
Побитовая операция
x&y
выполняет над соответствующими бита-
ми чисел
x
и
y
логическую операцию И. То есть над соответст-
вующими битами операндов выполняются следующие действия:
0 & 0 = 0
;
0 & 1 = 0
;
1 & 0 = 0
;
1 & 1 = 1
.
Например:
int x = 0x001F, y = 0x00F0, z;
z = x & y; /* z = 0x0010 */
Побитовая операция
x|y
выполняет над соответствующими бита-
ми чисел
x
и
y
логическую операцию ИЛИ. То есть над соот-
ветствующими битами операндов выполняются следующие дей-
ствия:
Глава 3. Операторы и выражения
43
0 | 0 = 0
;
0 | 1 = 1
;
1 | 0 = 1
;
1 | 1 = 1
.
Например:
int x = 0x000F, y = 0x00F0, z;
z = x | y; /* z = 0x00FF */
Побитовая операция
x^y
выполняет над соответствующими бита-
ми чисел
x
и
y
логическую операцию исключающее ИЛИ. То есть
над соответствующими битами операндов выполняются следую-
щие действия:
0 ^ 0 = 0
;
0 ^ 1 = 1
;
1 ^ 0 = 1
;
1 ^ 1 = 0
.
Например:
int x = 0x00FF, y = 0x0FF0, z;
z = x ^ y; /* z = 0x0F0F */
3.4. Операторы сравнения
В языке программирования C нет логических или булевых типов
данных. Вместо этого считается, что любое ненулевое значение
является истинным, а равное нулю — ложным. Операторы срав-
нения и логические операторы просто вычисляют значение типа
int
, которое равно
0
или
1
, в зависимости от значений операндов.
В языке программирования С определены следующие
операторы
сравнения
:
<
— бинарный оператор меньше;
>
— бинарный оператор больше;
<=
— бинарный оператор не больше;
Часть I. Язык программирования С
44
>=
— бинарный оператор не меньше;
==
— бинарный оператор равно;
!=
— бинарный оператор не равно.
Например, над двумя целыми числами можно выполнить сле-
дующие операторы сравнения:
int x = -1; y = 0, z;
z = x < y; /* z = 1 */
z = x > y; /* z = 0 */
z = x <= y; /* z = 0 */
z = x >= y; /* z = 0 */
z = x == y; /* z = 0 */
z = x != y; /* z = 1 */
Операндами операторов сравнения могут быть переменные и
литералы арифметических типов и указатели, о которых будет
рассказано далее. Результатом оператора сравнения является
R-value.
3.5. Логические операторы
Логические операторы
выполняют над своими операндами логи-
ческие операции НЕ, И и ИЛИ, учитывая при этом, что любое не
равное нулю значение считается истинным, а равное нулю значе-
ние — ложным. В языке программирования C определены сле-
дующие логические операторы:
!
— унарный оператор логического отрицания;
&&
— бинарный оператор логическое И;
||
— бинарный оператор логическое ИЛИ.
Логические операторы работают следующим образом. Перед вы-
числением значения логического оператора вычисляется логиче-
ское значение его операндов. После этого над полученными зна-
чениями операндов выполняется логическая операция. Результа-
том логической операции является R-value.
Например, над целыми числами можно выполнить следующие
логические операции:
Глава 3. Операторы и выражения
45
int x = -1, y = 0, z;
z = !x; /* z = 0 */
z = x && y; /* z = 0 */
z = x || y; /* z = 1 */
3.6. Выражения
Выражением
называется синтаксически правильно построенная
последовательность операторов и их операндов. Под словами
синтаксически правильная последовательность понимается, что
каждому оператору поставлены в соответствие операнды, кото-
рые в свою очередь тоже могут быть выражениями. Из этого оп-
ределения следует, что выражения строятся рекурсивно и могут
содержать несколько операторов. Ниже приведены примеры пра-
вильного и ошибочного выражений:
x + y * z /* правильное выражение */
x + y %% z /* ошибочное выражение */
Приоритетом оператора
(operator precedence) называется оче-
редность вычисления оператора в выражении, содержащем не-
сколько операторов. Операторы, рассмотренные в предыдущих
разделах, имеют следующие приоритеты, которые расположены
по убыванию:
! ~ - +
— унарные операторы;
* / %
— бинарные мультипликативные арифметические опе-
раторы;
+ -
— бинарные аддитивные арифметические операторы;
<< >>
— бинарные операторы сдвига влево и вправо;
< > <= >=
— бинарные операторы сравнения на неравенство;
== !=
— бинарные операторы сравнения на равенство;
&
— бинарный побитовый оператор И;
^
— бинарный побитовый оператор исключающее ИЛИ;
|
— бинарный побитовый оператор ИЛИ;
&&
— бинарный логический оператор И;
||
— бинарный логический оператор ИЛИ.