Операции языка С
Операция | Описание | Приоритет | Ассоциация |
Первичные и постфиксные операции | |||
[] | индексация массива | слева направо | |
() | вызов функции | слева направо | |
. | элемент структуры | слева направо | |
-> | элемент указателя | слева направо | |
++ | постфиксный инкремент | слева направо | |
-- | постфиксный декремент | слева направо | |
Одноместные операции | |||
++ | префиксный инкремент | справа налево | |
-- | префиксный декремент | справа налево | |
sizeof | размер в байтах | справа налево | |
(тип) | приведение типа | справа налево | |
~ | поразрядное NOT | справа налево | |
! | логическое NOT | справа налево | |
- | унарный минус | справа налево | |
& | взятие адреса | справа налево | |
* | разыменование указателя | справа налево | |
Двухместные и трехместные операции | |||
Мультипликативные | |||
* | умножение | слева направо | |
/ | деление | слева направо | |
% | взятие по модулю | слева направо | |
Аддитивные | |||
+ | сложение | слева направо | |
- | вычитание | слева направо | |
Поразрядного сдвига | |||
<< | сдвиг влево | слева направо | |
>> | сдвиг вправо | слева направо | |
Отношения | |||
< | меньше | слева направо | |
<= | меньше или равно | слева направо | |
> | больше | слева направо | |
>= | больше или равно | слева направо | |
== | равно | слева направо | |
! = | не равно | слева направо | |
Поразрядные | |||
& | поразрядное AND | слева направо | |
^ | поразрядное XOR | слева направо | |
| | поразрядное OR | слева направо | |
Логические | |||
&& | логическое AND | слева направо | |
|| | логическое OR | слева направо | |
Условные | |||
? : | условная операция | справа налево | |
Присваивания | |||
= | присваивание | справа налево | |
*= | присвоение произведения | справа налево | |
/= | присвоение частного | справа налево | |
%= | присвоение модуля | справа налево | |
+= | присвоение суммы | справа налево | |
-= | присвоение разности | справа налево | |
<<= | присвоение левого сдвига | справа налево | |
>>= | присвоение правого сдвига | справа налево | |
&= | присвоение AND | справа налево | |
^= | присвоение XOR | справа налево | |
|= | присвоение OR | справа налево | |
, | запятая | слева направо |
Арифметические операции.Арифметические операции применяются к вещественным, целым числам и указателям. Определены следующие бинарные арифметические операции:
Для арифметических операций действуют следующие правила. Бинарные операции сложения (+) и вычитания (-) применимы к целым и действительным числам, а также к указателям.
В операции сложения указателем может быть только один из двух операндов. В этом случае второй операнд должен быть целым числом. Указатель, участвующий в операции сложения, должен быть указателем на элемент массива. В этом случае добавление к указателю целого числа эквивалентно сдвигу указателя на заданное число элементов массива.
В операции вычитания указатель на элемент массива может быть первым операндом (тогда второй операнд - целое число) или оба операнда могут быть указателями на элементы одного массива. Вычитание из указателя целого числа эквивалентно сдвигу указателя на заданное число элементов массива. Вычитание двух указателей возвращает число элементов массива, расположенных между теми элементами, на которые указывают указатели.
В операциях умножения (*) и деления (/) операнды могут быть любых арифметических типов. При разных типах операндов применяются стандартные правила автоматического приведения типов. В операции вычисления взятие по модулю (остатка от деления) (%) оба операнда должны быть целыми числами.
В операциях деления и вычисления остатка второй операнд не может быть равен нулю. Если оба операнда в этих операциях целые, а результат деления является не целым числом, то знак результата вычисления остатка совпадает со знаком первого операнда, а для операции деления используются следующие правила:
Если первый и второй операнд имеют одинаковые знаки, то результат операции деления - наибольшее целое, меньшее истинного результата деления.
Если первый и второй операнд имеют разные знаки, то результат операции деления - наименьшее целое, большее истинного результата деления. Округление всегда осуществляется по направлению к нулю.
Определены следующие унарные арифметические операции:
Некоторые унарные операция алгоритмического языка C++ Builder
Замечание. Унарные операция имеет высокий приоритет, и при работе с ними желательно всегда учесть это обстоятельство.
Унарные операции инкремента (++) и декремента (--) сводятся к увеличению (++) или уменьшению (-) операнда на единицу. Операции применимы к операндам, представляющим собой выражения любых арифметических типов или типа указателя. Причем выражение должно быть модифицируемым L-значением, т.е. должно допускать изменение. Например, ошибочным является выражение ++(а+b), поскольку (а+b) не является переменной, которую можно модифицировать.
Операции инкремента и декремента выполняются быстрее, чем обычное сложение и вычитание. Поэтому, если переменная а должна быть увеличена на 1, лучше применить операцию (++), чем выражения а = а + 1 или оператор а += 1.
Если операция инкремента или декремента помещена перед переменной, говорят о префиксной форме записи инкремента или декремента. Если операция инкремента или декремента записана после переменной, то говорят, о постфиксной форме записи. При префиксной форме переменная сначала увеличивается или уменьшается на единицу, а затем это ее новое значение используется в том выражении, в котором она встретилась. При постфиксной форме в выражении используется текущее значение переменной, и только после этого ее значение увеличивается или уменьшается на единицу.
Например, в результате выполнения операторов:
int i = 1, j;
j = i++ * i++;
значение переменной i будет равно 3, а переменной j = 1. Оператор, присваивающий значение переменной j будет работать следующим образом сначала значение i, равное 1, умножится само на себя и присваивается j, затем значение i увеличится на 1 в результате первой операции инкремента и еще раз увеличится на 1 в результате второй операции инкремента.
Если изменить эти операторы следующим образом:
int i = 1, j;
j = ++i * ++i;
то результат будет другим: значение i будет равно 3, а значение j = 9. В этом случае оператор, присваивающий значение переменной j будет работать следующим образом: сначала выполнится первая операция инкремента, и значение i станет равно 2; затем выполнится вторая операция инкремента, и значение i станет равно 3; а затем это значение i умножится само на себя.
Поразрядные операции и сдвиги.Эти операции применяются к целочисленным данным. Последние рассматриваются просто как набор отдельных битов.
При поразрядных операциях каждый бит одного операнда комбинируется (в зависимости от операции) с одноименным битом другого, давая бит результата. При единственной одноместной поразрядной операции — отрицании (~) — биты результата являются инверсией соответствующих битов ее операнда.
При сдвиге влево биты первого операнда перемещаются влево (в сторону старших битов) на заданное вторым операндом число позиций. Старшие биты, оказавшиеся за пределами разрядной сетки, теряются; справа результат дополняется нулями.
Результат сдвига вправо зависит от того, является ли операнд знаковым или без знаковым. Биты операнда перемещаются вправо на заданное число позиций. Младшие биты теряются. Если операнд — целое со знаком, производится расширение знакового бита (старшего), т. е. освободившиеся позиции принимают значение 0 в случае положительного числа и 1 — в случае отрицательного. При без знаковом операнде старшие биты заполняются нулями.
Сдвиг влево эквивалентен умножению на соответствующую степень двойки, сдвиг вправо — делению. Например,
Num = Num <<4;
умножает Numна16.
Операции присваивания.Операция присваивания (=) не представляет особых трудностей. При ее выполнении значением переменной в левой части становится результат оценки выражения справа. Как уже говорилось, эта операция сама возвращает значение, что позволяет, например, написать:
а = b = с = someVar;
После исполнения такого оператора все три переменных а, b, с получат значение, равное someVar. Что касается остальных десяти операций присваивания, перечисленных в таблице, то они просто служат для сокращенной нотации присваивании определенного вида. Например,
s += i;
эквивалентно
s = s + i;
Другими словами, оператор вроде
х *= 3;
означает «текущее значение переменной х умноженное на 3 присвоить x».
Запятая.Помимо того, что запятая в С служит разделителем различных списков (как в списке параметров функции), она может использоваться и как операция. Запятая в этом качестве также является разделителем, но обладает некоторыми дополнительными свойствами.
Везде, где предполагается выражение, может использоваться список выражений, возможно, заключенный в скобки (так как операция-запятая имеет наинизший приоритет). Другими словами,
Выражение1, выражение2[, ...]
также будет выражением, оценкой которого является значение последнего элемента списка. При этом операция-запятая гарантирует, что оценка выражений в списке будет производиться по порядку слева направо. Вот два примера с операцией-запятой:
i++, j++;
// Значение выражения
// игнорируется.
res = (j = 4, j += n, j++);
// res присваивается n + 4.
// j равно n + 5.
Операция-запятая применяется довольно редко, обычно только в управляющих выражениях циклов.
Дата добавления: 2015-10-09; просмотров: 1071;