Операции присваиванuя (ранг 14)

Операции

Знаки операций.Для формирования и последующего вы­числения выражений используются операции. Для изображения одной операции в большинстве случаев используется несколько символов. В таблице 4 приведены все знаки операций, опреде­ленные стандартом языка. Операции в таблице разбиты на группы в соответствии с их рангами.

За исключением операций "[ ]", "( )" и "?", все знаки опера­ций распознаются компилятором как отдельные лексемы. В за­висимости от контекста одна и та же лексема может обозначать разные операции, Т.е. один и тот же знак операции может упот­ребляться в различных выражениях и по-разному интерпретиро­ваться в зависимости от контекста. Например, бинарная опера­ция & - это поразрядная конъюнкция, а унарная операция & ­это операция получения адреса.

Операции ранга 1 имеют наивысший приоритет. Операции одного ранга имеют одинаковый приоритет, и если их в выра­жении несколько, то они выполняются в соответствии с прави­лом ассоциативности либо слева направо (→), либо справа налево (←). Если один и тот же знак операции приведен в таб­лице дважды (например, знак *), то первое появление (с мень­шим по номеру, Т.е. старшим по приоритету, рангом) соответствует унарной операции, а второе - бинарной.

Опишем кратко возможности отдельных операций.

 

Таблица 1.4

Приоритеты (ранги) операций

 

  Ранг     Операции   Ассоциативность
1 ( )   [ ] -> .
2 !  ~ + - ++ -- & * (тип)  sizeof
3 * / % (мультипликативные бинарные)
4 + - (аддитивные бинарные)
5 << >> (поразрядный сдвиг)
6 < <= >= > (отношения)
7 == !=   (отношения)
8 & (поразрядная конъюнкция "И")
9 ^ (поразрядное исключающее "ИЛИ")
10 | (поразрядная дизъюнкция "ИЛИ")
11 && (конъюнкция "И")
12 || (дизъюнкция "ИЛИ")
13 ?:  (условная операция)
14 = *= /= %= += -= &= ^= |= <<= >>=
15 , (операция "запятая")

 

Унарные (одноместные) операции. Для изображения одноместных префиксных и постфиксных операций используются следующие символы:

 

& - операция получения адреса операнда (ранг 2);

* - операция обращения по адресу, т.е. раскрытия ссылки, иначе операция разыменования (доступа по ад­ресу к значению того объекта, на который указывает операнд). Операндом должен быть указатель            (ранг 2);

- - унарный минус, изменяет знак арифметического операнда (ранг 2);

+ - унарный плюс, введен для симметрии с унарным минусом (ранг 2);

~ - поразрядное  инвертирование  внутреннего    двоичного  кода целочисленного аргумента - побитовое отрица­ние (ранг 2);

! - НЕ - логическое отрицание значения операнда (ранг 2). Применяется к скалярным операндам. Целочис­ленный результат 0 (если операнд ненулевой, т.е. истинный) или 1 (если операнд нулевой, т.е. лож­ный). Напомним, что в качестве логических значе­ний в языке используют целые числа: 0 - ложь и не нуль, т.е. (!0) - истина. Отрицанием любого ненуле­вого числа будет 0,а отрицанием нуля будет 1. Та­ким образом: !1 равно 0; !2 равно 0; !(-5) равно 0; !0 равно 1;

++ -увеличение на единицу (инкремент или автоувеличение - ранг 2); имеет две формы:

префиксная операция - увеличение значения опе­ранда на 1 до его использования. Ассоциативность справа в соответствии со стандартом;

постфиксная операция - увеличение значения операнда на 1 после его использования. Ассоциатив­ность слева в соответствии со стандартом.

Операнд для операции ++(и для операции --) не может быть константой либо произвольным выраже­нием. Записи ++5 или 84++будут неверными. ++(j+k) также неверная запись. Операндами унарных опера­ций ++и - - должны быть всегда модифицируемые именующие выражения (L-value, left value, l-зна­чение, леводопустимое выражение). Термины "лево­допустимое выражение" и " l -значение" происходят от объяснения действия операции присваивания Е = D,в которой операнд Е слева от знака операции при­сваивания может быть только модифицируемым l значением. Примером модифицируемого l-значения служит имя переменной, которой выделена память. Таким образом, l-значение - ссылка на область памя­ти, значение которой доступно изменениям;

-- - уменьшение на единицу (декремент или автоумень­шение - ранг 2) - унарная операция, операндом ко­торой должно быть леводопустимое выражение, т.е. не константа и не выражение:

nрефиксная операция - уменьшение на 1 значения операнда до его использования;

постфиксная операция - уменьшение на 1 значе­ния операнда после его использования;

sizeof - операция (ранг 2) вычисления размера (в байтах) для объекта того типа, который имеет операнд. Разреше­ны два формата операции:

sizeof выражение

sizeof(тun).

sizeof не вычисляет значения выражения, а только определяет его тип, для которого затем вычисляется размер.

 

Бинарные (двуместные) операции делятся на следующие группы:

·аддитивные;

·мультипликативные;

·сдвигов;

·поразрядные;

·операции отношений;

·логические;

·присваивания;

·выбора компонента структурированного объекта;

·операция "запятая";

·скобки в качестве операций.

 

Аддитивные операции:

+  - бинарный плюс - сложение арифметических операндов или сложение указателя с целочисленным операндом (ранг 4);    .

- - бинарный минус - вычитание арифметических операн­дов или вычитание указателей (ранг 4).

Мультипликативные операции:

 

* - умножение операндов арифметического типа (ранг З);

/ - деление операндов арифметического типа (ранг 3).

При целочисленных операндах абсолютное значение результата округляется до целого. Например, 20/3 рав­но 6, -20/3 равно -6, (-20)/3 равно -6, 20/(-3) равно -6;

% - получение остатка от деления целочисленных операн­дов (деление по модулю - ранг 3). При неотрицатель­ных операндах остаток положительный. В противном случае остаток определяется реализацией. В компиля­торе Turbo С:

13%4 равняется 1, (-13)%4 равняется -1;

13%(-4) равно + 1, а (-13)%(-4) равняется -1.

При ненулевом делителе для целочисленных операн­дов всегда выполняется соотношение: (а/b)*b + а%b равно а.

 

Операции сдвига(определены только для целочисленных операндов). Формат выражения с операцией сдвига:

 

операнд _левый  операция_сдвига  операнд _ правый

<< - сдвиг влево битового представления значения левого целочисленного операнда на количество разрядов, рав­ное значению правого целочисленного операнда (ранг 5);

>> - сдвиг вправо битового представления значения левого целочисленного операнда на количество разрядов, рав­ное значению правого целочисленного операнда (ранг 5).

 

Поразрядные операции:

& - поразрядная конъюнкция (И) битовых представлений значений целочисленных операндов (ранг 8);

 ‌| - поразрядная дизъюнкция (ИЛИ) битовых представле­ний значений целочисленных операндов (ранг 10);

^ - по разрядное исключающее ИЛИ битовых представле­ний значений целочисленных операндов (ранг 9).

 

Результат выполнения операций сдвига и поразрядных операций:

4<<2 равняется 16;

5>>1 равняется 2;

6&5 равняется 4;

6 ‌| 5 равняется 7;

6 ^ 5 равняется 3.

 

Двоичный код для 4 равен 100, для 5 - это 101, для 6 - это 110 и т.д. При сдвиге влево на две позиции код 100 становится равным 10000 (десятичное значение равно 16). Остальные результаты операций сдвига и поразрядных опера­ций могут быть прослежены аналогично.

Обратите внимание, что сдвиг влево на п позиций эквивален­тен умножению значения на 2п, а сдвиг кода вправо уменьшает соответствующее значение в 2п раз с отбрасыванием дробной части и результата. (Поэтому 5>>1 равно 2.)

  

Операции отношений (сравнения):

< меньше, чем (ранг 6);

> больше, чем (ранг 6);

<= меньше или равно (ранг 6);

>= больше или равно (ранг 6);

== равно (ранг 7);

!= не равно (ранг 7).

Операнды операций отношений должны быть арифметиче­ского типа или могут быть указателями. Результат целочислен­ный: 0 (ложь) или 1 (истина). Последние две операции (операции сравнения на равенство) имеют более низкий при­оритет по сравнению с остальными операциями отношений. Та­ким образом, выражение (х < В = А < х) есть 1, когда значение х находится в интервале от А до В и А <В либо х, А, В равны. (Вначале вычисляются х < В и А < х, а к результатам применя­ется операция сравнения на равенство ==.)

Логические бинарные операции:

&& - конъюнкция (И) арифметических операндов или от­ношений                 (ранг 11). Целочисленный результат 0 (ложь) или 1 (истина);

‌ |‌| - дизъюнкция (ИЛИ) арифметических операндов или отношений (ранг 12). Целочисленный результат 0 (ложь) или 1 (истина).

 

Результаты отношений и логических операций:

3<5 равняется 1;

3>5 равняется 0;

3=5 равняется 0;

3 !=5 равняется 1;

3 !=5 |‌| 3=5                  равняется 1;

3+4>5 && 3+5>4 && 4+5>3 равняется 1. ‌

Операции присваиванuя (ранг 14)

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

Перечислим операции присваивания, отметив, что сущест­вуют одна простая операция присваивания и ряд составных опе­раций:

 

= - простое присваивание: присвоить значение выраже­ния-операнда из правой части операнду левой части. Пример: Р = 10.3 - 2*х;

*= - присваивание после умножения: присвоить операнду левой части про изведение значений обоих операндов. Р *= 2 эквивалентно              Р = Р * 2;

/= - присваивание после деления: присвоить операнду ле­вой части частное от деления значения левого опе­ранда на значение правого.                       Р /= 2.2 - d эквивалентно Р = Р / (2.2 - d);

%= - присваивание после деления по модулю: присвоить операнду левой части остаток от целочисленного де­ления значения левого операнда на значение правого операнда. N %= 3 эквивалентно            N = N % 3;

+= - присваивание после суммирования: присвоить опе­ранду левой части сумму значений обоих операндов А += В эквивалентно А = А + В;

 

-= - присваивание после вычитания: присвоить операнду левой части разность значений левого и правого опе­рандов. Х-=4.3-Z эквивалентно Х=Х-(4.3-Z);

<<= - присваивание после сдвигов разрядов влево: присво­ить целочисленному операнду левой части значение, полученное сдвигом влево его битового представле­ния на количество разрядов, равное значению пра­вого целочисленного операнда. Например,                 а <<= 4 эквивалентно а = а <<4; .

>>= - присваивание после сдвигов разрядов вправо: присво­ить целочисленному операнду левой части значение, полученное сдвигом вправо его битового представле­ния на количество разрядов, равное значению пра­вого целочисленного операнда. Например,                          а >>= 4 эквивалентно а = а >> 4;

&= - присваивание после поразрядной конъюнкции: при­своить целочисленному операнду левой части значе­ние, полученное поразрядной конъюнкцией (И) его битового представления с битовым представлением целочисленного операнда правой части               е &= 44 экви­валентно е = е & 44;

|= - присваивание после поразрядной дизъюнкции: при­своить целочисленному операнду левой части значе­ние, полученное поразрядной дизъюнкцией (ИЛИ) его битового представления с битовым представле­нием целочисленного операнда правой части               а |= b эквивалентно а = а | b;

^= - присваивание после исключающего по разрядного "ИЛИ": присвоить целочисленному операнду левой части значение, полученное применением поразряд­ной операции исключающего ИЛИ к битовым пред­ставлениям значений обоих операндов z ^= х + у эквивалентно  z = z ^ (х + у).

 

Обратите внимание, что для всех составных операций при­сваивания форма присваивания Е1 ор= Е2 эквивалентна Е1 = Е1 ор (Е2), где ор - обозначение операции.

 

Операции выбора компонентов структурированного объ­екта:

. (точка) - прямой выбор (выделение) компонента структу­рированного объекта, например объединения или структуры (ранг 1). Формат применения опера­ции:

                имя_структурированного _объекта. имя _ компо­нента

->       - косвенный выбор (выделение) компонента струк- турированного объекта, адресуемого указателем (ранг 1). При использовании операции требуется, чтобы с объектом был связан указатель. В этом случае фор­мат применения операции имеет вид:

указатель_на_структурированный_объект-> имя_ компонента

 

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

Запятая в качестве операции (ранг 15) Несколько выражений, разделенных запятыми ",", вычисля­ются последовательно слева направо. В качестве результата со­храняются тип и значение самого правого выражения. Таким образом, операция "запятая" группирует вычисления слева на­право. Тип и значение результата определяются самым правым из разделенных запятыми операндов (выражений). Значения всех левых операндов игнорируются. Например, если переменная х имеет тип int,то значением выражения (х=3, 3*х) будет 9, а переменная х примет                   значение 3.

 

Скобки в качестве операций

Круглые ( ) и квадратные [ ] скобки играют роль бинарных операций (ранг 1) при вызове функций и индексировании эле­ментов массивов.

 

Круглые скобки обязательны в обращении к функции:

имя _функции(список _аргументов)

где операндами служат имя_функции и список_аргументов. Ре­зультат вызова определяется (вычисляется) в теле функции, структуру которого задает ее определение.

В выражении

имя _ массива[ индекс]

операндами для операции [ ] служат имя_массива и индекс. Подробнее с индексированными переменными мы познакомим­ся позже.

Условная трехместная операция (ранг 13). В отличие от унарных и бинарных операций условная тернарная операция используется с тремя операндами. В изображении условной операции применяются два символа '?' и ':' и три выражения­ операнда:

 

выражение _1 ? выражение _ 2 : выражение _ 3

 

Первым вычисляется значение выражения _1. Если оно ис­тинно, т.е. не равно нулю, то вычисляется значение выраже­ния_2, которое становится результатом. Если при вычислении выражения_1 получится 0, то в качестве результата берется значение выражения _3. Классический пример:

х < 0? -х: х;

Выражение возвращает абсолютную величину переменной х.

 

Операция явного преобразования типа.Операция преобразования (приведения) типа (ранг 2) имеет следующий формат:

 (имя_типа) операнд

Такое выражение позволяет преобразовывать значение опе­ранда к заданному типу. В качестве операнда используется унарное выражение, которое в простейшем случае может быть переменной, константой или любым выражением, заключенным в круглые скобки. Например, преобразования (long)8 (вну­треннее представление результата имеет длину 4 байта) и (сhаг)8 (внутреннее представление результата имеет длину    1 байт) изменяют длину внутреннего представления целых кон­стант, не меняя их значений.

В этих преобразованиях константа не меняла значения и ос­тавалась целочисленной. Однако возможны более глубокие преобразования, например, (long doubIe)6 или (float)4 не только изменяют длину константы, но и структуру ее внутреннего представления. В результатах будут выделены порядок и ман­тисса, значения будут вещественными.

Преобразования типов арифметических данных нужно при­менять аккуратно, так как возможно изменение числовых зна­чений. При преобразовании больших целочисленных констант к вещественному типу (например, к типу float) возможна потеря значащих цифр (потеря точности). Если вещественное значение преобразуется к целому, то возможна ошибка при выходе полу­ченного значения за диапазон допустимых значений для целых. В этом случае результат преобразования не всегда предсказуем и целиком зависит от реализации.


Дата добавления: 2018-04-15; просмотров: 248; Мы поможем в написании вашей работы!

Поделиться с друзьями:




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