Бинарными1) арифметическими операторами являются +, -, *, /, а также оператор деления по модулю %. Деление целых сопровождается отбрасыванием дробной части, какой бы она ни была.
% к операндам типов float и double не применяется. В какую сторону (в сторону увеличения или
уменьшения числа) будет усечена дробная часть при выполнении / и каким будет знак результата операции
% с отрицательными операндами, зависит от машины.
Операторами отношения являются:
> - больше>= - больше или равно< - меньше⇐ - меньше или равноОператоры сравнения на равенство:
== - равно!= - не равноЛогические операторы:
&& - или|| - и&& или ||,
вычисляются слева направо. Вычисление прекращается, как только становится известна истинность или
ложность результата
Унарный оператор:
! - непредставляют из себя сокрашенные выражения
Каждое целое число в памяти представлено в виде определенного количества разрядов. И операции сдвига позволяют сдвинуть битовое представление числа на несколько разрядов вправо или влево. Операции сдвига применяются только к целочисленным операндам.
« - Сдвигает битовое представление числа, представленного первым операндом, влево на определенное количество разрядов, которое задается вторым операндом.» - Сдвигает битовое представление числа вправо на определенное количество разрядов.int a = 2 << 2; // 0b10 на два разрядов влево = 0b1000 = 8 int b = 16 >> 3; // 0b10000 на три разряда вправо = 0b10 = 2
Поразрядные операции также проводятся только над разрядами целочисленных операндов.
& - поразрядная конъюнкция (операция И или поразрядное умножение). Возвращает 1, если оба из соответствующих разрядов обоих чисел равны 1| - поразрядная дизъюнкция (операция ИЛИ или поразрядное сложение). Возвращает 1, если хотя бы один из соответствующих разрядов обоих чисел равен 1^ - поразрядное исключающее ИЛИ. Возвращает 1, если только один из соответствующих разрядов обоих чисел равен 1~ - поразрядное отрицание. Инвертирует все разряды операнда. Если разряд равен 1, то он становится равен 0, а если он равен 0, то он получает значение 1.int a = 5 | 2; // 0b101 | 0b010 = 0b111 = 7 int b = 6 & 2; // 0b110 & 0b010 = 0b10 = 2 int c = 5 ^ 2; // 0b101 ^ 0b010 = 0b111 = 7 int f = 12; // 0b00001100 int d = ~f; // 0b11110011 или -13
В ряде случаев преобразования сопровождаются потерей информации, например, когда числа большей разрядности (скажем размером 4 байт) получаем число меньшей разрядности (например, в 2 байта). Без потери информации проходят следующие цепочки преобразований:
char → short → int → longunsigned char → unsigned short → unsigned int → unsigned longfloat → double → long doubleПреобразования, применяемые компилятором при арифметических операциях:
Явное преобразование происходит через операторы преобразования:
int a = 10; int b = 4; int c = a / b; double d = a / b; double e = (double)a / (double)b; printf("c = %d \n", c); // 2 printf("d = %f \n", d); // 2.00000 printf("e = %f \n", e); // 2.50000 int number = 70; char symbol = (char) number; printf("symbol = %c \n", symbol); // F printf("symbol (int code) = %d \n", symbol); // 70
| Операторы | Выполняются |
|---|---|
| () [] -> . | слева направо |
| ! ~ ++ -- + - * & (тип) sizeof | справа налево |
| * / % | слева направо |
| + - | слева направо |
| << >> | слева направо |
| < <= > >= | слева направо |
| == != | слева направо |
| & | слева направо |
| ^ | слева направо |
| | | слева направо |
| && | слева направо |
| || | слева направо |
| ?: | справа налево |
| = += -= *= /= %= &= ^= |= <<= >>= | справа налево |
| , | слева направо |