Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C_Lect3.doc
Скачиваний:
7
Добавлен:
08.09.2019
Размер:
67.07 Кб
Скачать

1.4. Операции присваивания

Присваивание (=)

Выражение присваивания: переменная = выражение

Основное содержание операции — переменная получает новое значение, равное значению выражения в правой части.

В языке C присваивание — такая же операция, как сложение, умножение, деление и т.п., потому что оно вырабатывает значение (то, которое получила переменная в левой части), и это значение можно использовать дальше. Поэтому можно писать

x = y = 0;

x = (k = 2) + 3;

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

В программах часто встречаются конструкции вроде

k = k + 1

или

n=2*n

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

В языке C такие присваивания можно записывать более кратко благодаря наличию совмещенных операций присваивания:

x = x + a обозначается как x += a

x = x – a — " — x -= a

x = x*a — " — x *= a

x = x/a — " — x /= a

x = x%a — " — x %= a

Например, приведенные выше присваивания можно заменить такими:

k += 1

n *= 2

Особенно часто встречается в программах увеличение или уменьшение переменной на единицу. Для этих действий введены особые операции ++ и --, которые дают еще более краткую запись:

Увеличить на 1: x = x + 1  x += 1  x++ или ++x

Уменьшить на 1: x = x – 1  x -= 1  x-- или --x

Форма ++x называется префиксной, а x++ — постфиксной. В обеих формах операция увеличения (или уменьшения) одинаково меняет значение переменной. Однако значение, вырабатываемое операцией для дальнейшего использования, будет различным: префиксная операция дает значение переменной после увеличения (уменьшения), а постфиксная — значение переменной до ее изменения. Пусть, например, выполняется следующая последовательность операторов:

k = 5; k получает значение 5.

x = ++k; k получит значение 6, и это же значение будет присвоено x.

y = k++; k увеличится до 7, но y получит значение 6 (до увеличения).

z = (k++)*2; k получит значение 8, а z — значение 14.

1.5. Условная операция

Это тернарная операция (т.е. имеющая три операнда):

лог.значение ? результат1 : результат2

Например, m < n ? m : n выдает в качестве результата наименьшее из двух значений m и n.

1.6. Поразрядные операции над машинными словами

Поразрядные логические операции & | ^ ~

Эти операции рассматривают каждый бит (двоичный разряд) операнда как самостоятельное логическое значение (двоичные цифры 0 и 1 соответствуют логическим значениям ложь и истина). Операции & (поразрядное И), | (поразрядное ИЛИ) и ^ (поразрядное Исключающее ИЛИ) выполняются независимо над каждой парой соответственных битов двух операндов. Унарная операция ~ (поразрядное отрицание) применяется к каждому биту своего операнда и инвертирует его (заменяет нули единицами, а единицы — нулями).

Пусть, например, имеются две переменные a и b типа unsigned short int (16 двоичных разрядов), которым присвоены положительные целые значения 12345 и 54321. В двоичной системе эти числа запишутся так:

1234510 = 00110000001110012

5432110 = 11010100001100012

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

unsigned short int a, b, c;

a = 12345;

b = 54321;

c = a & b; переменная c получает значение 00010000001100012 = 414510

c = a | b; переменная c получает значение 11110100001110012 = 6252110

c = a ^ b; переменная c получает значение 11100100000010002 = 5837610

c = ~b; переменная c получает значение 00101011110011102 = 1121410

Попробуйте написать программу, выполняющую указанные операции и печатающую результат в десятичной системе, и убедитесь, что действительно получаются приведенные числа. Обратите внимание, что второе и третье числа окажутся отрицательными (3015 и 7160), если вывести их как целые со знаком (signed short int).

Примечание. Для вывода короткого целого без знака в функции printf нужно использовать спецификацию %hu, а для вывода короткого целого со знаком — %hd.

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

Ни в коем случае нельзя путать операции && (логическое И) и & (поразрядное И), || (логическое ИЛИ) и | (поразрядное ИЛИ), а также ! (логическое отрицание) и ~ (поразрядное отрицание). Рассмотрим такой пример:

int a, b;

a = 26;

b = 37;

Оба значения переменных a и b отличны от нуля, т.е. равносильны логическому значению истина. Поэтому выражение a && b даст значение 1 (истина). Однако результатом выражения a & b будет 0, что легко понять, если взглянуть на двоичное представление чисел 26 и 37: 2610 = 0110102, 3710 = 1001012.

Операции сдвига << и >> рассматривают свой левый операнд как последовательность битов (двоичных цифр); правый операнд (целое число) задает величину сдвига.

z << n содержимое z сдвигается влево на n двоичных разрядов,

z >> n содержимое z сдвигается вправо на n двоичных разрядов.

При сдвиге влево освобождающиеся младшие разряды заполняются нулями. При сдвиге вправо освобождающиеся старшие разряды могут заполняться либо нулями, либо содержимым самого старшего (знакового) разряда (это зависит от типа операнда z — signed или unsigned — и может также зависеть от особенностей системы команд процессора).

Таблица 2.1. Приоритеты и порядок выполнения операторов

---------------------------------------------------------

ОПЕРАЦИИ ВЫПОЛНЯЮТСЯ

---------------------------------------------------------

() [] -> . слева направо

! ~ ++ -- + - * & (тип) sizeof справа налево

* / % слева направо

+ - слева направо

<< >> слева направо

< <= > >= слева направо

== != слева направо

& слева направо

^ слева направо

| слева направо

&& слева направо

|| слева направо

?: справа налево

= += -= *= /= %= &= ^= |= <<= >>= справа налево

, слева направо

---------------------------------------------------------

Унарные операторы + и - имеют более высокий приоритет,

чем те же операторы в бинарном варианте.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]