Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Микропроцессоры(Коротицкий Евгений Викторович) / лабы_гр3480 / Основы языка Си для микроконтроллеров AVR.doc
Скачиваний:
1508
Добавлен:
18.04.2015
Размер:
797.7 Кб
Скачать
    1. Операнды и операции

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

Присваивание также является выражением, и значением такого выражения является величина, которая присваивается.

Операнд — это константа, литерал, идентификатор, вызов функции, индексное выражение, выражение выбора элемента или более сложное выражение, сформированное комбинацией операндов, знаков операций и круглых скобок. Любой операнд, который имеет константное значение, называется константным выражением. Каждый операнд имеет тип.

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

      1. Унарные операции

Унарное выражение состоит из операнда и предшествующего ему знака унарной операции и имеет следующий формат: знак-унарной-операции операнд.

В Табл. 4 перечислены унарные операции компилятора и приведены их знаки.

Табл. 4 – Унарные операции компилятора

Знак операции

Операция

$<?>$

арифметическое отрицание (отрицание и дополнение)

~

побитовое логическое отрицание (дополнение)

!

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

*

разадресация (косвенная адресация)

&

вычисление адреса

+ +

инкремент

- -

декремент

sizeof

размер

Унарные операции выполняются справа налево.

Операция арифметического отрицания ($<?>$) вырабатывает отрицание своего операнда. Операнд должен быть целым (int) числом или числом с плавающей точкой (float).

Пример:

/* Унарная операция (-) */

int х = 12; // Объявляем и инициализируем целую переменную х

х = -х; // переменной х присваивается её отрицание, т.е. х принимает значение -12

Операция двоичного дополнения (~) вырабатывает двоичное дополнение своего операнда. После этой операции все 1 в двоичном коде значения операнда меняются на 0, а все 0 — на 1.

Пример:

/* Унарная операция (~) */

unsigned char а=0b1001001; // Объявляем и инициализируем беззнаковую символьную переменную а unsigned char b;

// Объявляем беззнаковую символьную

// переменную b

b=~a; // С переменной а делаем операцию двоичного

// дополнения и полученное значение присваиваем

// переменной Ь. В результате

// b = 0b00ll0ll0 = 0x36 = 54

Операция логического отрицания НЕ (!) вырабатывает значение 0, если операнд есть истина (не ноль), и значение 1, если операнд равен нулю (0).

Пример:

/* Унарная операция (!) */

int х; // Объявляем целую переменную х

int у=0; // Объявляем и инициализируем целую переменную у

int z=0x4f; // Объявляем и инициализируем целую переменную z .

х=!у; // С переменной у делаем операцию логического отрицания и полученное значение присваиваем переменной х. В результате переменная х получит значение, равное 1, так как переменная у имела значение, равное 0 (ложно).

х= !z; //С переменной z делаем операцию логического отрицания и полученное значение присваиваем переменной х. В результате переменная х получит значение, равное 0, так как переменная z имела значение, не равное 0 (истина).

Операция разадресации (*) осуществляет косвенный доступ к адресуемой величине через указатель. Операнд должен быть указателем. Результатом операции является величина, на которую указывает операнд. Результат не определён, если указатель содержит недопустимый адрес.

Операция вычисления адреса (&) даёт адрес своего операнда. Операндом может быть любое именуемое выражение. Результатом операции вычисления адреса является указатель на операнд.

Пример:

/* Унарные операции (*) и (&) */

int х;

// Объявляем целую переменную x

int у=5;

// Объявляем и инициализируем целую переменную у

int *adress;

// Объявляем переменную adress как указатель, на что указывает знак * переменной adress присваивается

adress=&x;

// адрес (&) переменной х переменной, находящейся по адресу, содержащемуся в переменной adress,

*adress=y;

// присваивается значение переменной у, т. е. 5 , что

// эквивалентно записи х=у; т. е. х=5

adress=&y;

// переменной adress присваивается адрес (&)

// переменной у

x=*adress;

// переменной х присваивается значение, находящееся по адресу, содержащемуся в переменной adress, т. е. значение переменной у, что эквивалентно записи х = у; т. е. х = 5.

Операции инкремента и декремента увеличивают или уменьшают значение операнда на единицу и могут быть записаны как справа, так и слева от операнда. Если знак операции записан перед операндом (префиксная форма) (например, ++х), то изменение операнда происходит до его использования в выражении. Ес­ли знак операции записан после операнда (постфиксная форма) (например, х++), то операнд вначале используется в выражении, а затем происходит его изменение.

Пример:

/* Унарные операции (--) и (++) */

int у,- // Объявляем целую переменную у

int х = 5; // Объявляем и инициализируем целую переменную х

--х; // Переменная х будет уменьшена на 1, х = 4

++х; // Переменная х будет увеличена на 1, х = 5

у = 5 + х++; // Сначала берется текущее х (х = 5), к нему прибавляется значение 5, полученный результат присваивается переменной у. После этого значение х увеличивается на 1. Таким образом, после выполнения этой строки у = 10, х = 6

С помощью операции sizeofможно определить размер памяти в байтах, которая соответствует идентификатору или типу. Операцияsizeofимеет следующий формат:

sizeof(выражение)

В качестве выражения может быть использован любой идентификатор либо имя типа, заключённое в скобки.

Пример:

/* Унарная операция (sizeof) */

double х; // Объявляем переменную х двойной точности

int у; // Объявляем целую переменную у

y=sizeof(х); // у = 4, т. к. х имеет тип double и занимает в памяти 4 Б

y=sizeof(char); // у=1, т. к. тип char занимает в памяти 1 Б.