Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С
Шрифт:
Табл. 3.2. Операторы языка Си
Операторы общей группы. Круглые скобки из группы общих операторов используются для определения порядка выполнения действий над операндами. Допустим, в строке программы записано следующее выражение:
2 * 23 + 15
Оператор умножения имеет приоритет над оператором сложения, поэтому результат вычисления выражения будет равен 61. Какие изменения мы должны внести в выражение, если хотим сначала сложить 23 и 15, и лишь затем умножить сумму на 2? Для изменения порядка действий над операндами мы воспользуемся круглыми скобками:
2 * (23 + 15)
И
Фигурные скобки следует использовать для объединения некоторого множества операторов в законченный смысловой блок, например в функцию или цикл «loop». Примеры использования фигурных скобок, а также других операторов из группы общих рассматриваются в разделе 3.4.
Операторы группы арифметических операций. Рассмотрим последовательность выполнения действий над операндами при исполнении микроконтроллером следующего выражения:
Sum = 2 + 3;
Для вычисления значения переменной sum сначала реализуется оператор сложения «+», а затем оператор присваивания «=». В колонке 1 табл. 3.2 отражено, что оператор сложения имеет приоритет над оператором присваивания. При этом необходимо, чтобы переменная sum ранее была определена как int. Что произойдет в случае, если переменная sum ранее была объявлена как переменная другого типа, например float? После сложения результат будет преобразован к тому формату представления числа, который был объявлен при определении переменной sum.
Рассматриваемый пример может быть реализован с использованием другого синтаксиса:
Подразумевается, что все упомянутые переменные num1, num2 и sum ранее были определены.
Операторы инкремента и декремента производят действия только над одной переменной. При этом, три приведенных ниже записи, отличаются синтаксисом выражения, но производят одинаковые действия:
Аналогично, три следующих записи реализуют операцию декремента, т.е. уменьшения на единицу переменной number.
Операция получения целочисленного остатка от деления 2%3 возвращает 2, так как целочисленное деление 2 на 3 не может быть произведено. Результат операции 14%3 также равен 2, поскольку результат целочисленного деления 14 на 3 равен 4 с остатком 2.
Операторы логической группы. Операторы этой группы используются для определения условий, по которым реализуется ветвление алгоритма. Операторы логической группы возвращают в виде результата 1, если результат операции «правда», и 0, если результат операции «ложь». Допустим, мы хотим сравнить текущее значение некоторой переменной с пороговым значением 82. Для этого могут быть использованы операторы больше «>», меньше «<», больше или равно «>=», меньше или равно «<=», не равно «!=» или равно «==». Рассмотрим следующую запись на Си:
После исполнения приведенной строки программы переменной value будет присвоено значение 1 или 0. Уместно вспомнить, что логические операции имеют приоритет над операцией присваивания. Поскольку результатом «вычисления» выражения справа может быть только 0 или 1, то и переменная value должна быть ранее объявлена соответствующим образом.
Операторы группы битовых манипуляций. Как было отмечено ранее, одним из преимуществ языка Си для программирования микроконтроллерных систем по сравнению с другими языками высокого уровня, является возможность непосредственного изменения данных в ячейках памяти, например с использованием оператором побитового логического И, ИЛИ и Исключающего ИЛИ. Самый простой пример применения операций сдвига это умножение и деление числа на число 2n. Рассмотрим результат выполнения следующих трех операторов:
Допустим, что три используемые в примере переменные определены как 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, то после выполнения следующих трех операторов:
значение переменной new_number_one будет равно 192 (двоичный код 00000000 11000000), а значение переменной new_number_two — 3 (двоичный код 00000000 00000011).
Рассмотрим два других логических оператора: поразрядное логическое И и поразрядное логическое ИЛИ.
Символ | Операция | Пример |
---|---|---|
& | Логическое И | *(0x0023) & 0x57 |
| | Логическое ИЛИ | *(0x0000) | 0x35 |
Все числа, записанные в колонке «Пример», представлены в шестнадцатеричном коде, поскольку содержат префикс 0x. Унарный оператор * показывает, что действие будет производиться над содержимым ячейки памяти с физическим адресом, значение которого в шестнадцатеричном коде указано в скобках.
Результат операции логического И над двумя двоичными числами 01011100 и 11000111 будет равен :