Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Уровень 2 (унарные или одноместные операторы)



Порядок: ß

Операторы:

* - извлечь содержимое памяти по известному адресу,

& - получить адрес объекта, для которого задано определение,

+ - присвоение знака,

- - изменение знака,

! - логическое отрицание,

~ - обращение двоичного представления,

++ - увеличение,

-- - уменьшение,

(< имя-типа> ) - приведение типа,

sizeof (a) - объем операнда в байтах, где a – выражение | имя типа.

Рассмотрим правила и примеры применения некоторых операторов данной группы.

Операторы * и & применяются при работе с объектами типа указатель ( pointer ). * имеет операндом выражение типа указатель, то есть определяющее некоторый адрес в памяти, результатом будет значение, лежащее по этому адресу. Для оператора & операндом является любой объект программы (скаляр, массив или структура), которому выделена память. Результатом будет начальный адрес отведенной объекту памяти. Для переменных типа указатель литералы не определены, т.е. указателю нельзя задать непосредственно адрес памяти.

Пример.

short x, y, *px;

............

x=15;

px=& x;

y=*px; // Это эквивалентно y=x

Для указателей применимы операторы сложения и вычитания.

Пример. y=*(px+a);

y будет равно значению, которое находится в памяти, смещенной относительно адреса px на a элементов типа short, т. е. на 2* a байтов. Такие манипуляции имеют смысл только для массивов, элементы которых по определению занимают непрерывную область памяти и располагаются с некоторого начального адреса.

Одноместный оператор + применяется редко, чтобы избежать перестановки коммутативных операндов, когда порядок вычислений существенен. Одноместный оператор - используется для изменения знака операнда и имеет особенности только для беззнаковых ( unsigned ) операндов, которые не могут принимать отрицательных значений.

Пример.

unsigned short a, b;

a=45846;

b=-a; // b=65536-45846=19690 Такую операцию называют сложением по

// модулю 216

Оператор ~ является битовой операцией и носит название обращение двоичного представления или поразрядное отрицание.

Пример.

unsigned char a, b;

................

a=201; // =3118=110010012

b=~a; //=54 = 668=001101102

Операторы ++ и -- имеют 2 формы: постфиксную: p++ и префиксную: ++p. Разница между ними заключается в том, что, если эти операторы входят в состав более сложного выражения, то при постфиксной форме сначала вычисляется это более сложное выражение, затем происходит изменение значения переменной, а при префиксной форме – наоборот.

Примеры.

int x, n, y;

..........

n=5;

x=++n; // x=6; n=6

y=n++; // y=6; n=7

Дано {ai}, i=1...n. Сформировать {bk}, k=1... из ai< 0 в порядке их следования.

for (k=i=0; i< n; i++){

if (a[ i ]< 0){

b[k++] = a[ i ];

}

}

Оператор sizeof (размер) используется для вычисления объема памяти, занимаемого операндом. Операнды бывают двух типов: < выражение> |< имя_типа>. В первом случае результатом будет значение выражения. Частным случаем выражения является имя объекта программы (скалярной переменной, массива или структуры).

Пример.

short a, b[100], x;

x= sizeof (a); // 2 байта

x= sizeof (b); // 200 байтов

Форма sizeof (< имя_типа> ) в качестве результата дает объем памяти, отводимый под переменную данного типа. Заметим, что в качестве типа может использоваться тип данных, определенный программистом.

Пример.

sizeof ( short ) // 2 байта

sizeof (date) // 11 байтов

Чаще всего данный оператор употребляется при выделении памяти, управляемом программистом. Средства такого выделения памяти будут рассмотрены в другом разделе.

В языке Basic используются только унарные операторы + -.и логическое отрицание, однако последнее имеет другое написание и приоритет.

Уровень 3 (мультипликативные операторы)

Порядок: à

Операторы: * - умножение, / - деление, % - остаток от деления.

При выполнении оператора * транслятор может переупорядочивать операнды. Иногда это может привести к проблемам. В общем случае a*b*f(& a)! = f(& a)*a*b, поскольку при выполнении функции f значение переменной a может измениться.

В языке Basic используются те же операторы * и /. Вместо оператора % применяется оператор Mod и добавляется оператор \ - деление нацело.

Уровень 4 (аддитивные операторы)

Порядок: à

Операторы: + - сложение, - - вычитание.

Операндами являются арифметические выражения и\или указатели. При работе с указателями имеются существенные ограничения. При сложении второй операнд может быть только целым литералом или переменной, которая задает смещение относительно исходного адреса на соответствующее число элементов типа указателя. Например, если p имеет тип short*, то выражение p+i дает смещение от значения p на 2* i байтов, если p имеет тип double*, то смещение составит 8* i байтов. Как правило, все получаемые адреса должны находиться в пределах памяти, отведенной некоторому массиву, иначе подобные манипуляции приводят к ошибкам и теряют смысл.

Пример.

double *p, *q, a[100];

int l;

...................

p=& a[5];

q=& a[71];

l=q-p; // l=66

В языке Basic используются те же операторы + и -. Если операндами для + являются строки, то результатом будет сцепление (конкатенация) операндов.

Уровень 5 (сдвиги)

Это битовые операции.

Порядок: à

Операторы: > > - сдвиг вправо, < < - сдвиг влево.

Выражение с данными операторами имеет вид: E 1> > E 2, где E 2 - число битов сдвига. Операнд E 1 обычно является беззнаковой целой переменной, которой задается восьмеричное или шестнадцатиричное значение.

Пример.

unsigned short a, b, c;

..........

a=0x0ff0;

b=a< < 4; // b=ff00;

c=a> > 4; // c=00ff;

В языке Basic также есть операторы сдвига, использующие для их записи те же символы > > и < < и работающие аналогично.

Уровень 6 (отношения)

Порядок: à

Операторы: < - меньше, < = - меньше или равно, > - больше, > = - больше или равно.

Операнды: арифметические выражения | указатели.

Нельзя записывать кратные неравенства так: a < b < c. В соответствии с порядком получаем ( a < b )< c. Выражение a < b может принимать одно из двух значений: true (1) или false (0). Тогда результирующее выражение будет иметь вид: 1< c или 0< c в зависимости от значений a и b. Правильная запись имеет вид: a < b & & b < c.

Уровень 7 (равенство и неравенство)

Порядок: à

Операторы: == - равно,! = - не равно.

Если операндами являются арифметические выражения, то имеет место обычное сравнение и результатом выполнения оператора является значение true (1) или false (0). Для операндов – логических выражений – это логические операции: эквивалентность и неэквивалентность.

Указатель можно сравнивать только с целым 0. В файле stdio.h определена символическая константа #define NULL 0, которая употребляется для фиксации того факта, что указатель не адресует никакую область памяти.

В языке Basic используются операторы = и < > соответственно. В отличие от языка С их уровень совпадает с уровнем операторов отношения и операндами являются только арифметические выражения.

Поразрядные операторы

Порядок: à

Операндами для них являются целые (лучше беззнаковые unsigned ) значения. Операторы обрабатывают стоящие на одинаковых позициях двоичные разряды внутреннего представления операндов. Отсюда и название: поразрядные или битовые. Результат действия приведен в параграфе 4.4.

Оператор Уровень Наименование
& И
^ Исключающее или
| Или

 

 

Пример.

unsigned a, b, c, d, e;

..................................

a=0x7ac3; // 0111 1010 1100 0011 – двоичное представление

b=0x5bf9; // 0101 1011 1111 1001

c=a& b; // 0101 1010 1100 0001 -> 0x5ac1

d=a^b; // 0010 0001 0011 1010 -> 0x213a

e=a|b; // 0111 1011 1111 1011 -> 0x7bfb

Логические операторы

Порядок: à

Оператор Уровень Наименование
& & И
|| Или

Если первый операнд для оператора & & равен 0, то второй не вычисляется. Если первый операнд для оператора || равен 1, то второй не вычисляется.

Логические операторы языка Basic: Not (отрицание), And (И) и Or (Или).Также имеются операторы AndAlso, OrElse , Xor, Eqv и Imp. Уровень их соответствует уровню логических операторов языка С. Приоритет между ними следующий (по убыванию слева направо): Not { And | AndAlso }{ Or | OrElse } Xor Eqv Imp.

Результат выполнения всех операторов и различие между операторами And и AndAlso, Or и OrElse показано в параграфе 4.4. Следует обратить внимание на существенную разницу в уровне приоритета операторов отрицания! (язык С ) и Not (язык Basic ).


Поделиться:



Последнее изменение этой страницы: 2017-04-12; Просмотров: 322; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.032 с.)
Главная | Случайная страница | Обратная связь