Чтение онлайн

на главную - закладки

Жанры

Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С

Пак Дэниэл Дж.

Шрифт:

Табл. 3.2. Операторы языка Си

Операторы общей группы. Круглые скобки из группы общих операторов используются для определения порядка выполнения действий над операндами. Допустим, в строке программы записано следующее выражение:

2 * 23 + 15

Оператор умножения имеет приоритет над оператором сложения, поэтому результат вычисления выражения будет равен 61. Какие изменения мы должны внести в выражение, если хотим сначала сложить 23 и 15, и лишь затем умножить сумму на 2? Для изменения порядка действий над операндами мы воспользуемся круглыми скобками:

2 * (23 + 15)

И

результат вычислений станет равным 76.

Фигурные скобки следует использовать для объединения некоторого множества операторов в законченный смысловой блок, например в функцию или цикл «loop». Примеры использования фигурных скобок, а также других операторов из группы общих рассматриваются в разделе 3.4.

Операторы группы арифметических операций. Рассмотрим последовательность выполнения действий над операндами при исполнении микроконтроллером следующего выражения:

Sum = 2 + 3;

Для вычисления значения переменной sum сначала реализуется оператор сложения «+», а затем оператор присваивания «=». В колонке 1 табл. 3.2 отражено, что оператор сложения имеет приоритет над оператором присваивания. При этом необходимо, чтобы переменная sum ранее была определена как int. Что произойдет в случае, если переменная sum ранее была объявлена как переменная другого типа, например float? После сложения результат будет преобразован к тому формату представления числа, который был объявлен при определении переменной sum.

Рассматриваемый пример может быть реализован с использованием другого синтаксиса:

num1 = 2;

num2 = 3;

sum = num1 + num2;

Подразумевается, что все упомянутые переменные num1, num2 и sum ранее были определены.

Операторы инкремента и декремента производят действия только над одной переменной. При этом, три приведенных ниже записи, отличаются синтаксисом выражения, но производят одинаковые действия:

number = number + 1;

number++;

++number;

Аналогично, три следующих записи реализуют операцию декремента, т.е. уменьшения на единицу переменной number.

number = number - 1;

number--;

– -number;

Операция получения целочисленного остатка от деления 2%3 возвращает 2, так как целочисленное деление 2 на 3 не может быть произведено. Результат операции 14%3 также равен 2, поскольку результат целочисленного деления 14 на 3 равен 4 с остатком 2.

Операторы логической группы. Операторы этой группы используются для определения условий, по которым реализуется ветвление алгоритма. Операторы логической группы возвращают в виде результата 1, если результат операции «правда», и 0, если результат операции «ложь». Допустим, мы хотим сравнить текущее значение некоторой переменной с пороговым значением 82. Для этого могут быть использованы операторы больше «>», меньше «<», больше или равно «>=», меньше или равно «<=», не равно «!=» или равно «==». Рассмотрим следующую запись на Си:

value = temperature > 82;

После исполнения приведенной строки программы переменной value будет присвоено значение 1 или 0. Уместно вспомнить, что логические операции имеют приоритет над операцией присваивания. Поскольку

результатом «вычисления» выражения справа может быть только 0 или 1, то и переменная value должна быть ранее объявлена соответствующим образом.

Операторы группы битовых манипуляций. Как было отмечено ранее, одним из преимуществ языка Си для программирования микроконтроллерных систем по сравнению с другими языками высокого уровня, является возможность непосредственного изменения данных в ячейках памяти, например с использованием оператором побитового логического И, ИЛИ и Исключающего ИЛИ. Самый простой пример применения операций сдвига это умножение и деление числа на число 2n. Рассмотрим результат выполнения следующих трех операторов:

number = 24;

new_number_one = number << 1;

new_number_two = number >> 1;

Допустим, что три используемые в примере переменные определены как int. В первой строке переменной number присваивается значение 24 в десятичной системе счисления. Это же значение в двоичной системе счисления будет равно 00000000 00011000. Результатом действия оператора «<<» будет сдвиг влево на один разряд значения переменной number, т.е. 00000000 00110000 или 48 в десятичной системе счисления. Это значение и будем присвоено переменной new_number_one. В третьей строке оператор «>>» реализует сдвиг вправо числа number. Получится новое двоичное число 00000000 00001100 или 12 в десятичной системе счисления. В результате, значение переменной new_number_one будет равно удвоенному значению переменной number, в то время как переменная new_number_two будет равна поделенному на 2 значению number. С использованием рассматриваемых операторов мы можем также выполнить сдвиг на несколько разрядов, тогда результат операции будет эквивалентен умножению или делению на 2n. Например, если n = 3, то после выполнения следующих трех операторов:

number = 24;

new_number_one = number << 3;

new_number_two = number >> 3;

значение переменной new_number_one будет равно 192 (двоичный код 00000000 11000000), а значение переменной new_number_two — 3 (двоичный код 00000000 00000011).

Рассмотрим два других логических оператора: поразрядное логическое И и поразрядное логическое ИЛИ.

Символ Операция Пример
& Логическое И *(0x0023) & 0x57
| Логическое ИЛИ *(0x0000) | 0x35

Все числа, записанные в колонке «Пример», представлены в шестнадцатеричном коде, поскольку содержат префикс 0x. Унарный оператор * показывает, что действие будет производиться над содержимым ячейки памяти с физическим адресом, значение которого в шестнадцатеричном коде указано в скобках.

Результат операции логического И над двумя двоичными числами 01011100 и 11000111 будет равен :

01011100

& 11000111

– ---------

01000100

Поделиться:
Популярные книги

Печать Пожирателя

Соломенный Илья
1. Пожиратель
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Печать Пожирателя

Привет из Загса. Милый, ты не потерял кольцо?

Лисавчук Елена
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Привет из Загса. Милый, ты не потерял кольцо?

Мастер 2

Чащин Валерий
2. Мастер
Фантастика:
фэнтези
городское фэнтези
попаданцы
технофэнтези
4.50
рейтинг книги
Мастер 2

Нечто чудесное

Макнот Джудит
2. Романтическая серия
Любовные романы:
исторические любовные романы
9.43
рейтинг книги
Нечто чудесное

Клан

Русич Антон
2. Долгий путь домой
Фантастика:
боевая фантастика
космическая фантастика
5.60
рейтинг книги
Клан

Имя нам Легион. Том 3

Дорничев Дмитрий
3. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 3

Запасная дочь

Зика Натаэль
Фантастика:
фэнтези
6.40
рейтинг книги
Запасная дочь

Убивать чтобы жить 7

Бор Жорж
7. УЧЖ
Фантастика:
героическая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 7

У врага за пазухой

Коваленко Марья Сергеевна
5. Оголенные чувства
Любовные романы:
остросюжетные любовные романы
эро литература
5.00
рейтинг книги
У врага за пазухой

Кодекс Охотника. Книга XXI

Винокуров Юрий
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXI

Генерал Скала и ученица

Суббота Светлана
2. Генерал Скала и Лидия
Любовные романы:
любовно-фантастические романы
6.30
рейтинг книги
Генерал Скала и ученица

Оцифрованный. Том 1

Дорничев Дмитрий
1. Линкор Михаил
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Оцифрованный. Том 1

Его маленькая большая женщина

Резник Юлия
Любовные романы:
современные любовные романы
эро литература
8.78
рейтинг книги
Его маленькая большая женщина

Хуррит

Рави Ивар
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Хуррит