Приоритеты выполнения операций 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Приоритеты выполнения операций



В языке С‑51 операции с высшими приоритетами вычисляются первыми. Наивысшим приоритетом является приоритет равный 1. Приоритеты и порядок операций приведены в табл. 22.6. Порядок вычисления выражения следующий: сначала выполняются операторы в круглых скобках, в них от старшего приоритета к младшему, а среди равнозначных операторов — слева направо.

Таблица 22.6.

Приоритет Знак операции Типы операции Порядок выполнения
  () []. -> Выражение Слева направо
  - ~! * & ++ -- sizeof операции приведения типов Унарные Справа налево
  * / % Мультипликативные Слева направо
  + - Аддитивные
  << >> Сдвиг
  < > <= >= Отношение
  ==!= Отношение (равенство)
  & Поразрядное И
  ^ Поразрядное исключающее ИЛИ
  | Поразрядное ИЛИ
  && Логическое И
  || Логическое ИЛИ
  ?: Условная
  = *= /= %= += –= &= |= >>= <<= ^= Простое и составное присваивание Справа налево
  , Последовательное вычисление Слева направо

Операторы языка программирования C-51

В языке программирования C‑51 используется два типа операторов: операторы объявления и выполняемые операторы. Все операторы C‑51 заканчиваются точкой с запятой.

Операторы объявления

Объявление является неисполняемым оператором, который объявляет некоторый объект или набор объектов, связывает с ним один или несколько идентификаторов и, если это необходимо, распределяет память микроконтроллера.

В объявлении могут быть объявлены три типа объектов: переменные, метки и функции. В программе для каждого имени допустимо только одно объявление. Метка полностью объявлена, если она стоит перед выполняемым оператором и заканчивается с двоеточием ‘:’. Например:

vfg: svGorit(); //Вызов подпрограммы с именем svGorit

Переменные, константы, литералы и подпрограммы должны быть объявлены раньше, чем они будут использоваться в исполняемом операторе. Объявление переменной заключается в задании типа этой переменной и ее имени. Тип переменной записывается перед именем переменной. Например:

char Rejim; //Переменная, хранящая номер режима размером в один байтint Schet; //Переменная, использующаяся как счётчик размером в два байта

 

В языке программирования C-51 нет необходимости знать конкретный адрес переменной, достаточно обратиться к ней по имени Rejim или Schet.

Функция объявляется точно так же как и переменные. То есть перед именем подпрограммы-функции записывается тип переменной, которую возвращает подпрограмма после своего завершения. Так как в подпрограмму в свою очередь тоже могут передаваться переменные, которые называются параметрами подпрограммы, то эти переменные записываются в скобках после имени подпрограммы-функции. Перед каждой переменной обязательно указывается ее тип. Например:

 

char PrinjatByte(void); //Подпрограмма, предназначенная для приёма одного байта.

Так как подпрограмме приёма обычно не требуется никаких дополнительных переменных, то вместо переменной-параметра подпрограммы указано слово void, обозначающее, что у подпрограммы-функции нет параметров.

Исполняемые операторы

ú Оператор присваивания:

ú Условный оператор.

ú Структурный оператор.

ú Оператор цикла for

ú Оператор цикла с проверкой условия до тела цикла

ú Оператор цикла с проверкой условия после тела цикла

ú Оператор continue

ú Оператор выбора

ú Оператор безусловного перехода

ú Оператор выражение

ú Оператор возвращения из подпрограммы

ú Пустой оператор

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

Оператор присваивания

Оператор присваивания записывается в виде:

 

Переменная=выражение;

Выражение вычисляется, и полученное значение присваивается переменной. Например:

 

P0=2; //Установить начальные потенциалы на ножках второго порта микроконтроллераa=cos(b*5); //Этот оператор присваивания осуществляет вызов подпрограммы-функции.

Достаточно часто требуется изменять значение какой-либо переменной. То есть и источником и приёмником данных служит одна и та же переменная. В этом случае можно воспользоваться составным оператором присваивания. Использование составного оператора сокращает исходный текст программы. Например:

 

sum+=3; //Оператор эквивалентен оператору sum=sum+3;Umensh-=5; //Оператор эквивалентен оператору Umensh=Umensh-5;a*=10; //Оператор эквивалентен оператору a=a*5;mask&=0x10;/* Оператор эквивалентен оператору mask=mask&5; Обычно используется для записи нулей в определённые биты переменной */

Условный оператор

Оператор if обеспечивает условное выполнение операторов. Он записывается в следующей форме:

 

if(<выражение>) <operator-1>; [else <operator-2>;]

При этом ключевое слово else со следующим за ним исполняемым оператором представляют собой необязательную часть условного оператора. Если результат вычисления выражения равен 1 (истина), то выполняется operator-1. Если результат вычисления выражения равен 0 (ложь), то выполняется operator-2. Если выражение ложно и отсутствует оператор-2, то выполняется оператор, следующий за условным. Пример записи условного оператора:

 

if(Wes<Min) /*Условная операция*/ Schetch=Schetch+1; /*Плечо 1*/ else Schetch=0; /*Плечо 2*/

В качестве условия могут быть использованы не только операции отношения. Напомню, что операции отношения вычисляют битовую величину. Поэтому в условном операторе могут быть использованы любые битовые переменные, в том числе ножки портов и подпрограммы-функции, возвращающие битовое значение. Использование битовых переменных и подпрограмм позволяет увеличить читаемость исходного текста программы. Примеры использования битовых переменных и подпрограмм-функций в условном операторе:

 

if(P1.5)fnKn5Naj(); /* В этом примере предполагается, что к пятой ножке порта P1 подключена кнопка с надписью "5"*/ if(Kn5Naj)fnKn5Naj(); /* Этот пример эквивалентен предыдущему, но ножке P1.5 поставлена в соответствие переменная Kn5Naj*/ if(PrinjatByte())DecodCmd(); /* Предполагается, что функция PrinjatByte возвращает значение '1', если байт принят*/

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

Структурный оператор {}

Существует два основных способа использования структурного оператора:

48. Структурный оператор может рассматриваться в качестве отдельного оператора языка С-51 и использоваться в программе везде, где может встречаться отдельный исполняемый оператор. Это используется в операторах for, while, do while, switch of и if;

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

Каждый оператор внутри структурного оператора может являться любым оператором языка C‑51, в том числе и объявлением, при условии, что все объявления внутри структурного оператора должны быть выполнены до первого исполняемого оператора.

Структурный оператор начинается с открывающей скобки ‘{‘ и записывается в следующем виде:

 

{<operator-1>; //Здесь могут быть объявления переменных <operator-2>;... <operator-n>;}

Заметим, что в конце составного оператора точка с запятой не ставится. Пример использования структурного оператора:

 

if(Wes<Min) /*Условная операция*/ {incr=incr*2; /*Структурный оператор*/ Schetch=Schetch+1; /*Содержит два оператора*/ }

Структурные операторы могут вкладываться друг в друга:

 

{<operator-1>; <operator-2>; {<operator-A>; <operator-B> <operator-C>; } <operator-3>; <operator-4>;}

Пример использования объявлений внутри вложенного структурного оператора:

 

int main () {int q,b; float t,d;... if(...) {int e,g; float f,q;... }... return (0); }

Переменные e, g, f, q будут уничтожены после выполнения составного оператора. Отметим, что переменная q является локальной в составном операторе, т.е. она никоим образом не связана с переменной q объявленной в начале функции main с типом int. Отметим также, что выражение стоящее после return может быть заключено в круглые скобки, хотя наличие последних необязательно.

Оператор цикла for

Оператор for — это наиболее общий способ организации цикла. Оператор цикла for записывается в следующей форме:

 

for (выражение 1; выражение 2; выражение 3) тело цикла;

Выражение 1 обычно используется для установления начального значения переменных, управляющих циклом. Выражение 2 — это выражение, определяющее условие, при котором тело цикла будет выполняться. Выражение 3 определяет изменение переменных, управляющих циклом после каждого выполнения тела цикла. В качестве тела цикла может служить любой исполняемый оператор языка C‑51, в том числе и составной оператор. Внутри составного оператора может быть заключено любое количество исполняемых операторов.

Схема выполнения оператора for:

50. Вычисляется выражение 1.

51. Вычисляется выражение 2.

52. Если значения выражения 2 отлично от нуля (истина), выполняется тело цикла, вычисляется выражение 3 и осуществляется переход к пункту 2, если выражение 2 равно нулю (ложь), то управление передается на оператор, следующий за оператором for.

 

Обратите внимание, что проверка условия всегда выполняется в начале цикла. Это значит, что тело цикла может ни разу не выполниться, если условие выполнения сразу будет ложным.

Пример использования оператора for:

 

for(i=1;i<10;i++) //от i равного 1 до 10 с шагом 1 выполнить b=i*i;

В этом примере вычисляются квадраты чисел от 1 до 9.

Некоторые варианты использования оператора for повышают его гибкость за счет возможности использования нескольких переменных, управляющих циклом.

Пример:

 

int main() {int top,bot; char string[100],temp; for(top=0,bot=100;top<bot;top++,bot--) {temp=string[top]; string[bot]=temp; } return 0; }

В этом примере, реализующем запись строки символов в обратном порядке, для управления циклом используются две переменные top и bot. Отметим, что на месте выражение 1 и выражение 3 здесь используются несколько выражений, записанных через запятую, и выполняемых последовательно.

Так как согласно синтаксису языка С‑51 оператор может быть пустым, тело оператора for также может быть пустым. Такая форма оператора может быть использована для организации поиска.

Пример:

 

for(i=0;t[i]<10;i++);

В данном примере переменная цикла i принимает значение номера первого элемента массива t, значение которого больше 10.

При написании программ для микроконтроллеров достаточно часто требуется реализовать бесконечный цикл. В этом случае оператор цикла for принимает следующий вид:

 

for(;;) //Постоянно {Knop=P2; //опрашивать порт P2 ObrabSobyt(); //и обрабатывать нажатие кнопок }

Оператор цикла for — это универсальный оператор, поэтому его реализация в машинных командах достаточно сложна. Для написания программ часто достаточно более простых операторов цикла. Использование таких операторов обычно приводит к более компактным и быстродействующим программам, однако это не относится к языку программирования C‑51. В компиляторе языка программирования C‑51 именно этот оператор оптимизирован наилучшим образом.



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 185; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.133.79.70 (0.017 с.)