Курс лекций - Микропроцессоры

Выражения в операторах языка программирования C-51 - часть 3


  1. '!' инверсия операнда
  2. '~' побитовая инверсия операнда

Например, пусть в переменной a хранится число 5. Тогда:

a=~a; //~00000101 = 11111010 = 250 a=~a; //~11111010 = 00000101 = 5 a=!a; //(00000101)->1; ~1 = 0 a=!a; // ~0 = 1

В условном операторе и операторах цикла используются операции отношения:

  1. < меньше
  2. > больше
  3. <= меньше или равно
  4. >= больше или равно
  5. == равно
  6. != не равно

Если указанное отношение между операндами верно, то результат равен 1, иначе 0. Например, если d=7, то:

(d > 5) результат будет 1 (истина) (d = 4) результат будет 0 (ложь)

Над переменными-указателями возможно проведение адресных операций.

  1. '*' операция косвенной адресации
  2. '&' вычисление адреса переменной

Операция косвенной адресации '*' осуществляет доступ к переменной при помощи указателя. Результатом операции является значение переменной, на которую указывает операнд. Типом результата является тип переменной, адресуемой указателем. При работе с указателями необходимо быть предельно осторожными, так как, если указатель содержит недопустимый адрес, то результат операции чтения или записи будет непредсказуем и может привести к выходу проектируемого устройства из строя.

Операция вычисления адреса переменной '&' дает адрес ячейки памяти своего операнда. Операндом может быть любой идентификатор. Имя функции или массива также может быть операндом операции вычисления адреса переменной, хотя в этом случае знак операции вычисления адреса переменной является лишним, так как имена массивов и функций являются и так являются адресами. Операция вычисления адреса переменной не может применятся к элементам структуры, являющимися полями битов, и к объектам с классом памяти register.

Пример использования адресных операций при работе с указателем:

int t, f=0, *adress; adress = &t /* переменной adress, объявленной как указатель, присваивается адрес переменной t */ *adress =f; /* переменной находящейся по адресу, содержащемуся в переменной adress, присваивается значение переменной f, т.е. 0, что эквивалентно t=f; т.е.t=0; */

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

void PutNadp(char code *c)//Объявлен указатель c на символ в памяти программ {do{while(!TI); //Подождать готовности последовательного порта TI=0; SBUF=*c++; //Передать очередной символ }while(*c!=0); //Если передан последний символ строки } //то выйти из подпрограммы ... PutNadp("привет!"); //Вывод одной строки ... PutNadp("Вася!"); //Вывод второй строки


- Начало -  - Назад -  - Вперед -