Операции
Знаки операций.Для формирования и последующего вычисления выражений используются операции. Для изображения одной операций в большинстве случаев используется несколько символов. В таблице приведены все знаки операций, определенные стандартом языка. Операции в таблице разбиты на группы в соответствии с их рангами.
За исключением операций "[]", "()" и "?:", все знаки операций распознаются компилятором как отдельные лексемы. В зависимости от контекста одна и та же лексема может обозначать разные операции, т.е. один и тот же знак операции может употребляться в различных выражениях и по-разному интерпретироваться в зависимости от контекста. Например, бинарная операция & - это поразрядная конъюнкция, а унарная операция & - это операция получения адреса.
Операции ранга 1 имеют наивысший приоритет. Операции одного ранга имеют одинаковый приоритет, и если их в выражении несколько, то они выполняются в соответствии с правилом ассоциативности либо слева направо (→), либо справа налево (). Если один и тот же знак операции приведен в таблице дважды (например, знак *), то первое появление (с меньшим по номеру, т.е. старшим по приоритету, рангом) соответствует унарной операции, а второе - бинарной.
Опишем кратко возможности отдельных операций.
Приоритеты (ранги) операций
Ранг | Операции | Ассоциативность |
() [] → • | → | |
! ~ + - ++ -- & * (тип) sizeof | ||
* / % (мультипликативные бинарные) | → | |
+ - (аддитивные бинарные) | → | |
« » (поразрядного сдвига) | → | |
< <= >= > (отношения) | → | |
= != (отношения) | → | |
& (поразрядная конъюнкция "И") | → | |
Ù (поразрядное исключающее "ИЛИ") | → | |
| (поразрядная дизъюнкция "ИЛИ") | → | |
&& (конъюнкция "И") | → | |
|| (дизъюнкция "ИЛИ") | → | |
?: (условная операция) | ||
= *= /= %= += -= &= Ùл= |= «= »= | ||
, (операция "запятая") | → |
Унарные (одноместные) операции.Для изображения одноместных префиксных и постфиксных операций используются следующие символы:
& - операция получения адреса операнда (ранг 2);
* - операция обращения по адресу, т.е. раскрытия ссылки, иначе операция разыменования (доступа по адресу к значению того объекта, на который указывает операнд). Операндом должен быть указатель (ранг 2);
- - унарный минус, изменяет знак арифметического операнда (ранг 2);
+ - унарный плюс, введен для симметрии с унарным минусом (ранг 2);
~ - поразрядное инвертирование внутреннего двоичного кода целочисленного аргумента - побитовое отрицание (ранг 2)\
!- НЕ - логическое отрицание значения операнда (ранг 2). Применяется к скалярным операндам. Целочисленный результат 0 (если операнд ненулевой, т.е. истинный) или 1 (если операнд нулевой, т.е. ложный). Напомним, что в качестве логических значений в языке используют целые числа: 0 - ложь и не нуль, т.е. (!0) - истина. Отрицанием любого ненулевого числа будет 0, а отрицанием нуля будет 1. Таким образом: !1 равно 0; !2 равно 0; !(-5) равно 0; !0 равно 1;
++ - увеличение на единицу (инкремент или автоувеличение -ранг 2).
-- - уменьшение на единицу (декремент или автоуменьшеие - ранг 2) - унарная операция, операндом которой должно быть леводопустимое выражение, т.е. не константа и не выражение:
sizeof - операция (ранг 2) вычисления размера (в байтах) для объекта того типа, который имеет операнд. Разрешены два формата операции:
sizeofвыражение
sizeof(mun).
sizeofне вычисляет значения выражения, а только определяет его тип, для которого затем вычисляется размер.
Бинарные (двуместные) операцииделятся на следующие группы:
• аддитивные;
• мультипликативные;
• сдвигов;
• поразрядные;
• операции отношений;
• логические;
• присваивания;
• выбора компонента структурированного объекта;
• операция "запятая";
• скобки в качестве операций.
Аддитивные операции:
+ - бинарный плюс - сложение арифметических операндов или сложение указателя с целочисленным операндом (ранг 4);
- - бинарный минус - вычитание арифметических операндов или вычитание указателей (ранг 4).
Мультипликативные операции:
* - умножение операндов арифметического типа (ранг 3);
/ - деление операндов арифметического типа (ранг 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.
При ненулевом делителе для целочисленных операндов всегда выполняется соотношение: (a/b)*b + a%b равно а.
Операции отношений (сравнения):
< меньше, чем (ранг 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.
Операции присваивания (ранг 14)
В качестве левого операнда в операциях присваивания может использоваться только модифицируемое именующее выражение (l-значение), т.е. ссылка на некоторую именованную область памяти, значение которой доступно изменениям.
Перечислим операции присваивания, отметив, что существуют одна простая операция присваивания и ряд составных операций:
= - простое присваивание: присвоить значение выражения-операнда из правой части операнду левой части. Пример: Р = 10.3 - 2*х;
*= - присваивание после умножения: присвоить операнду левой части произведение значений обоих операндов. Р *= 2 эквивалентно Р = Р * 2;
/= - присваивание после деления: присвоить операнду левой части частное от деления значения левого операнда на значение правого. Р /= 2.2 - d эквивалентно Р=- Р / (2.2 - d);
%= - присваивание после деления по модулю: присвоить операнду левой части остаток от целочисленного деления значения левого операнда на значение правого операнда. N %= 3 эквивалентно N = N % 3;
= - присваивание после суммирования: присвоить операнду левой части сумму значений обоих операндов А += В эквивалентно А = А + В;
-= - присваивание после вычитания: присвоить операнду левой части разность значений левого и правого операндов. X -= 4.3 - Z эквивалентно X = X - (4.3 - Z);
Обратите внимание, что для всех составных операций присваивания форма присваивания Е1 ор= Е2 эквивалентна Е1 = El op (E2), где ор - обозначение операции.
Запятая в качестве операции (ранг 15)
Несколько выражений, разделенных запятыми ",", вычисляются последовательно слева направо. В качестве результата сохраняются тип и значение самого правого выражения. Например, если переменная х имеет тип int, то значением выражения (х=3, 3*х) будет 9, а переменная х примет значение 3.
Условная трехместная операция (ранг 13). В отличие от унарных и бинарных операций условная тернарная операция используется с тремя операндами. В изображении условной операции применяются два символа '?' и ':' и три выражения-операнда:
выражение_1 ? выражение_2 : выражение_3
Первым вычисляется значение выражения_1. Если оно истинно, т.е. не равно нулю, то вычисляется значение выражения_2, которое становится результатом. Если при вычислении выражения_1 получится 0, то в качестве результата берется значение выражения_3. Классический пример:
х < 0 ? -х : х;
Выражение возвращает абсолютную величину переменной х.
Операция явного преобразования типа. Операция преобразования (приведения) типа (ранг 2) имеет следующий формат:
(имя_типа) операнд
Такое выражение позволяет преобразовывать значение операнда к заданному типу. В качестве операнда используется унарное выражение, которое в простейшем случае может быть переменной, константой или любым выражением, заключенным в круглые скобки.
Дата добавления: 2015-10-09; просмотров: 715;