б) некоторые операции могут работать только с определенными типами данных, например, побитовые операции применяются только к целым типам данных;
в) в сложных выражениях, содержащих ряд операций, исполнение большинства операций выполняется слева направо, за исключением, унарных операций и операций присваивания. Если необходимо задать строго определенный порядок исполнения выражения можно использовать круглые скобки;
г) в сложных выражениях последовательность исполнения операций определяется их приоритетом (см. крайнюю правую колонку в табл. 4.1, где 1 – наибольший приоритет исполнения операции).
Таблица 4.1.
| Опера-ция | Назначение | Пример | Прио-ритет | 
| Первичные операции | |||
| [] | индекс массива | x[2][0]=5; | 1 | 
| () | вызов функции, очередность выполнения | y=sin(6.28*(x+1)); | 1 | 
| . | элемент структуры (прямой доступ) | time.tm_hour=5; | 1 | 
| -> | элемент структуры (косвенный доступ) | time->tm_hour=5; | 1 | 
| Унарные операции | |||
| ++ | инкремент (увеличение на единицу) | i++ | 2 | 
| –– | декремент (уменьшение на единицу) | i–– | 2 | 
| sizeof | размер в байтах | x=sizeof(int); | 3 | 
| (тип) | преобразование типа | y=(float)5/2; | 3 | 
| - | унарный минус (изменение знака) | y=-x; | 3 | 
| * | косвенная адресация | int x=*y; | 3 | 
| & | взятие адреса | scanf(“%d”,&x); | 3 | 
| Арифметические операции | |||
| * | умножение | 20*x | 4 | 
| / | деление | x/10 | 4 | 
| % | деление по модулю | x%10 | 4 | 
| + | сложение | x+20 | 5 | 
| – | вычитание | 40–x | 5 | 
| Битовые операции | |||
| ~ | побитовое НЕ | y=~x; | 3 | 
| << | побитовый сдвиг влево | y=x<<1; | 6 | 
| >> | побитовый сдвиг вправо | y=x>>1; | 6 | 
| & | побитовое И | y=x&15; | 9 | 
| ^ | побитовое исключающее ИЛИ | y=x^15; | 10 | 
| | | побитовое ИЛИ | y=x|15; | 11 | 
Продолжение таблицы 4.1.
| Опера-ция | Назначение | Пример | Прио-ритет | 
| Операции отношения | |||
| < | меньше | if (x<6) | 7 | 
| > | больше | if (x>6) | 7 | 
| <= | меньше или равно | if (x<=6) | 7 | 
| >= | больше или равно | if (x>=6) | 7 | 
| == | равно | if (x==6) | 8 | 
| != | не равно | if (x!=6) | 8 | 
| Логические операции | |||
| ! | логическое отрицание (операция НЕ) | if (!x) | 3 | 
| && | логическое умножение (операция И) | if (x>0 && x<6) | 12 | 
| || | логическое сложение (операция ИЛИ) | if (x<0 || x>6) | 13 | 
| Условная операция | |||
| ?: | при условии | a>b?10;-10 | 14 | 
| Операции присваивания | |||
| = | присваивание | x=5 | 15 | 
| *= | присвоение произведения | x*=3 | 15 | 
| /= | присвоение частного | x/=3 | 15 | 
| %= | присвоение остатка | x%=3 | 15 | 
| += | присвоение суммы | x+=3 | 15 | 
| –= | присвоение разности | x–=3 | 15 | 
| <<= | присвоение левого сдвига | x<<=3 | 15 | 
| >>= | присвоение правого сдвига | x>>=3 | 15 | 
| &= | присвоение И | x&=3 | 15 | 
| ^= | присвоение исключающего ИЛИ | x^=3 | 15 | 
| |= | присвоение ИЛИ | x|=3 | 15 | 
| Прочие операции | |||
| , | запятая | a=1, b=2; | 16 | 
4.2. Арифметические операции
Операции сложения, вычитания, умножения и деления можно использовать ко всем типам данных. Если операнды одного типа, то результат будет того же типа. Например, вычисляя выражение 12/5, так как операнды целые числа, то в результате получим целое число 2 (округление не выполняется). С другой стороны, если рассчитывается выражение 12./5, результатом будет вещественное число 2.4.
Операция деление по модулю используется при необходимости вычисления остатка от деления целых чисел, например, при вычислении выражения 17%3, результатом будет целое число 2.
4.3. Операции присваивания
Эти операторы имеют наименьший приоритет при вычислении выражений, т.е. выполняются в последнюю очередь (за исключением оператора запятая). В языке Си знак равенства означает выполнение операции присваивания. Например, выражение
x=10+3*4;
означает, что вначале вычисляется выражение слева от знака равенства и затем результат присваивается переменной x. Поэтому выражения
x=x+2;
приобретают при программировании строго определенный смысл: вначале вычисляется выражение справа от знака равенства (к старому значению переменной x прибавляется число 2) и затем полученный результат присваивается переменной x.
Оператор присваивания выполняется справа налево. В языке Си возможно использования выражений с несколькими операторами присваивания, например, допустимо использовать следующее выражение
с=b=5*(a=5*45);
Оно выполняется в следующем порядке: вычисляется значение 5*45, результат присваивается переменной ‘а’, затем эта переменная умножается на 5 и результат присваивается переменной ‘b’, и далее присваивается переменной ‘c’.
Помимо традиционной операции присваивания в языке Си существуют дополнительные операции: +=, –=, *= и т.п. Например, операции слева и справа в приведенной ниже таблице идентичны
| a=a+10; | a+=10; | 
| a=a/10; | a/=10; | 
| a=a&64; | a&=10; | 
| a=a>>1; | a>>=1; | 
Достоинства этих операции – они выполняются быстрее, чем операции с обычным присваиванием.
4.3.1.Пример 4.1
Пример использования арифметических операций и операций присваивания:
Листинг 4.1
#include <stdio.h>
void main()
{
int a=25,b=3,с,d;
float x=25.,y=3,z;
c=a/b;
d=a%b;
printf(“Деление целых чисел: %d\nОстаток: %d\n”,c,d);
z=x/y;
printf(“Деление вещественных чисел: %d %d\n”,c,d);
a=a+10;
y=y*3;
printf(“Традиционная форма операции присваивания: %d %f\n”,a,y);
a+=10;
y*=3;
printf(“Присваивание со сложение и умножением: %d %f”,a,y);
}
Результат выполнения программы:
Деление целых чисел: 8
остаток: 1
Деление вещественных чисел: 8.333333
Традиционная форма операции присваивания: 35 9.000000
Присваивание со сложение/умножением: 45 27.000000
4.4. Операции отношения
Эти операции позволяют сравнивать друг с другом данные, например:
x>0 y<=xz!=27 g==’\n’
Значения переменных после выполнения операции сравнения не изменяется, каждое выражения проверяется – истинно оно или ложно. В языке Си истинному значению выражения с операцией отношения соответствует единичный результат, ложному – нулевой. Например, выражение
y=x>5;
определяет значение переменной ‘у’ равным единице для ‘x’ равным 25 и равным нулю для ‘х’ равным –5.
Согласно табл. 4.1. наибольшим приоритетом обладает операции ‘<’ и ‘>’, наименьшими равенство и неравенство. Поэтому, например, выражение
(x>5 == y<10)
будет выполняться в следующем порядке:
– сравнение y<10;
– сравнение x>5;
– сравнение на равенство.
4.5. Логические операции
В языке Си отсутствуют данные типа булева переменная, но существуют логические операции, в которых можно использовать данные типа символ или целое в любой модификации. При этом подразумевается, что нулевое значение выражения соответствует значению «FALSE» (ложь), а любое другое – значению «TRUE» (истина). Эти операции: логическое умножение && (операция И), сложение || (операция ИЛИ) и отрицание ! (операция НЕ). Результат выполнения этих операций для различных значений целых переменных a и b приведен в табл. 4.2.
Таблица 4.2.
| Значение  переменной a  |  Значение  переменной b  |  Результат | |||
| a&&b | a||b | !a | !b | ||
| ноль | ноль | 0 | 0 | 1 | 1 | 
| ноль | отлично от ноля | 0 | 1 | 1 | 0 | 
| отлично от ноля | ноль | 0 | 1 | 0 | 1 | 
| отлично от ноля | отлично от ноля | 1 | 1 | 0 | 0 | 
Следует отметить, что «истинным» значением переменной считается не только ее положительное значение, но и отрицательное. Если выражение при выполнении логической операции является «истиной», то результату присваивается значение единица, в противном случае – нулевое значение.
4.5.1. Пример 4.2
Листинг 4.2
#include <stdio.h>
void main()
{
int x=5,y=-3;
printf(“x&&y x||y !x !y x>3 y>0\n”);
printf(“%3d %3d %3d %3d %3d %3d”,x&&y,x||y, !x, !y,x>3,y>-10);
}
Результатом исполнения программы будут строки на экране
x&&yx||y !x !yx>3 y>0
1 1 0 0 1 0
Согласно табл. 4.1. наибольшим приоритетом среди логических операций обладает операция НЕ. Поэтому, например, оператор
z=a&&b||!c&&d;
будет выполняться в следующем порядке:
– операция НЕ переменной c;
– операция И операндов a и b;
– операция И операндов (!c) и d;
– операция ИЛИ операндов (a&&b) и (!c&&d).
Логические операции можно использовать и для реализации сложных неравенств. Например, для составления условия 10<x<20 в языке Си необходимо записать логическое выражение (x>10 && x<20), а математическое выражение x<10Èx>20 можно представить в виде (x<10 || x>20).
4.6. Битовые операции
Эти операции позволяют выполнять проверку и изменение отдельных битов в данных целого и символьного типов. Их нельзя использовать для вещественных чисел. Действие битовых операций идентично логическим, но они выполняются над каждым битом данных.
Каждая из битовых операций служит определенным целям. Например, операция & (И) полезна для проверки единичных значений отдельных битов числа, а также для установки определенных битов в «0». Операция | (ИЛИ) полезна для установки в «1» битов. Операция ^ (Исключающее ИЛИ) используется для проверки несовпадения битов. Операции сдвига << и >> позволяют сдвинуть все биты числа влево/вправо на заданное количество разрядов. Недостающие значения битов дополняются нулями, информация в исчезающих битах теряется.