Арифметические операции.
Бинарными арифметическими операциями являются +, -, *, /
и операция деления по модулю %(дает остаток от деления). Операцию % нельзя использовать с типами float или double. имеется унарная операция – и унарная операции +.
Операции отношения и логические операции.
Операциями отношения являются: => > =< < Все они имеют одинаковое старшинство. Непосредственно за ними по уровню старшинства следуют операции равенства и неравенства: == != которые тоже имеют одинаковое старшинство. операции отношения младше арифметических операций, так что выражения типа I<LIM-1 понимаются как I<(LIM-1), как и предполагается. Выражения, связанные операциями && (логическое и) и || (логическое или), вычисляются слева направо, причем их рассмотрение прекращается сразу же как только становится ясно, будет ли результат истиной или ложью. Если выражение истинно результат 1, если ложно 0. Унарная операция отрицания ! преобразует ненулевой или истинный операнд в 0, а нулевой или ложный операнд в 1.
Операции увеличения и уменьшения.
В языке "C" предусмотрены две необычные операции для увеличения и уменьшения значений переменных. Операция увеличения ++ добавляет 1 к своему операнду, а операция уменьшения -- вычитает 1. Необычный аспект заключается в том, что ++ и -- можно
использовать либо как префиксные операции (перед переменной, как в ++N), либо как постфиксные (после переменной: N++). Эффект в обоих случаях состоит в увеличении N. Но выражение ++N увеличивает переменную N до использования ее значения, в то время как N++ увеличивает переменную N после того, как ее значение было использовано. Это означает, что в контексте, где используется значение переменной, а не только эффект увеличения, использование ++N и N++ приводит к разным результатам. Если N = 5, то х = N++; устанавливает х равным 5, а х = ++N; полагает х равным 6. В обоих случаях N становится равным 6. Операции увеличения и уменьшения можно применять только к переменным; выражения типа х=(I+J)++ являются незаконными.
Побитовые логические операции
& Побитовое AND
| Побитовое включающее OR
^ побитовое исключающее OR
<< сдвиг влево
>> сдвиг вправо
arg1 << arg2
левый аргумент подлежит сдвигу а правый определяет число битов на которые нужно произвести сдвиг
Во время сдвига влево происходит дополнение нулями справа. Во время сдвига вправо дополнение нулями происходит в том случае если, когда левый аргумент имеет тип unsigned. В остальных случаях определение того, какого вида сдвиг: логический (дополнение нулями) или арифметический (дополнение битом знака), производит система
~ отрицание битов (унарная операция)
Операции и выражения присваивания
Кроме простого оператора присваивания, в си есть составные операторы присваивания. Большинству бинарных операций (операций подобных +, которые имеют левый и правый операнд) соответствует операция присваивания вида оп=, где оп - одна из операций
+ - * / % << >> & \^ \!
Если е1 и е2 - выражения, то е1 оп= е2 эквивалентно е1 = (е1) оп (е2) за исключением того, что выражение е1 вычисляется только один раз.
X *= Y + 1
Вычисляется как
X = X * (Y + 1)
а не как
X = X * Y + 1
Условный оператор
Трехаргументный оператор ?: е1 ? e2 : е3 значит если е1 истинно (т е отлично от 0) то е2 иначе е3
Преобразование типов
char c=’a’;
c=c+1;
Что будет находится в с?
Если в выражениях встречаются операнды разных типов, то они могут быть преобразованы. Во-первых, типы char и int могут свободно смешиваться в арифметических выражениях: каждая переменная типа char автоматически преобразуется в int. Неявные арифметические преобразования работают в основном, как и ожидается. В общих чертах, если операция типа + или *, которая связывает два операнда (бинарная операция), имеет операнды разных типов, то перед выполнением операции "низший" тип преобразуется к "высшему" и получается результат "высшего" типа. Более точно, к каждой арифметической операции применяется следующая последовательность правил преобразования.
- Типы CHAR и short преобразуются в int, а float в double.
- Затем, если один из операндов имеет тип double, то другой преобразуется в double, и результат имеет тип double.
- В противном случае, если один из операндов имеет тип long, то другой преобразуется в long, и результат имеет тип long.
- В противном случае, если один из операндов имеет тип unsigned, то другой преобразуется в unsigned и результат имеет тип unsigned.
- В противном случае операнды должны быть типа int, и результат имеет тип int.
Преобразования возникают и при присваиваниях; значение правой части преобразуется к типу левой, который и является типом результата. Возможны неявные преобразования
char к int, short, long
int, short, long к char, short,int,long, float, double, unsigned int
float к double, int, short, long
double к float, int, short, long
при этом float преобразуется в int отбрасыванием дробной части. Тип double преобразуется во float округлением. Длинные целые преобразуются в более короткие целые и в переменные типа char посредством отбрасывания лишних битов высокого порядка.
Наконец, в любом выражении может быть осуществлено ("принуждено") явное преобразование типа с помощью конструкции, называемой перевод (CAST). В этой конструкции, имеющей вид:
(имя типа) выражение
выражение преобразуется к указанному типу по правилам преобразования, изложенным выше.