
- •Основы языка си для микроконтроллеров avr
- •1. Основы языка Си для микроконтроллеров avr
- •Препроцессор языка Cи его команды
- •Директива #include
- •Директивы #define, #undef
- •Директивы #if, #ifdef, #ifndef, #else и #endif
- •Встроенные макросы
- •Директива #line
- •Директива #error
- •Директивы #asmи #endasm
- •Зарезервированные ключевые слова
- •Идентификаторы
- •Комментарии
- •Константы
- •Переменные
- •Массивы
- •Типы данных
- •Операнды и операции
- •Унарные операции
- •Бинарные операции
- •Приоритеты операций и порядок вычислений
- •Операторы
- •If-else
- •Оператор for
- •Do-while
- •Continue
- •Оператор-выражение
- •Пустой оператор
- •Составной оператор
- •Функции
- •Указатели
- •Доступ к регистрам ввода/вывода
- •Побитовый доступ к регистрам ввода/вывода
- •Доступ к eeprom-памяти
- •Использование прерываний
- •Организация памяти sram
Операнды и операции
Комбинация знаков операций и операндов, результатом которой является определённое значение, называется выражением. Знаки операций определяют действия, которые должны быть выполнены над операндами. Каждый операнд в выражении может быть выражением. Значение выражения зависит от расположения знаков операций и круглых скобок в выражении, а также от приоритета выполнения операций.
Присваивание также является выражением, и значением такого выражения является величина, которая присваивается.
Операнд — это константа, литерал, идентификатор, вызов функции, индексное выражение, выражение выбора элемента или более сложное выражение, сформированное комбинацией операндов, знаков операций и круглых скобок. Любой операнд, который имеет константное значение, называется константным выражением. Каждый операнд имеет тип.
Выражения со знаками операций могут участвовать в выражениях как операнды. Выражения со знаками операций могут быть унарными (с одним операндом), бинарными (с двумя операндами) и тернарными (с тремя операндами).
Унарные операции
Унарное выражение состоит из операнда и предшествующего ему знака унарной операции и имеет следующий формат: знак-унарной-операции операнд.
В Табл. 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 Б.