мета-данные страницы
операторы
Арифметические операторы
Бинарными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
Неявное преобразование
Преобразования, применяемые компилятором при арифметических операциях:
- Если один из операндов имеет тип long double, то второй операнд тоже будет преобразован в тип long double
- Если предыдущий пункт не выполняется и если один из операндов имеет тип double, то второй операнд тоже будет преобразован к типу double
- Если предыдущий пункт не выполняется и если один из операндов имеет тип float, то второй операнд тоже будет преобразован к типу float
- Если предыдущий пункт не выполняется и если один из операндов имеет тип unsigned long int, то второй операнд тоже будет преобразован к типу unsigned long int
- Если предыдущий пункт не выполняется и если один из операндов имеет тип long, то второй операнд тоже будет преобразован к типу long
- Если предыдущий пункт не выполняется и если один из операндов имеет тип unsigned, то второй операнд тоже будет преобразован к типу unsigned
- Если предыдущий пункт не выполняется то оба операнда приводятся к типу int
Явное преобразование
Явное преобразование происходит через операторы преобразования:
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 | справа налево |
| * / % | слева направо |
| + - | слева направо |
| << >> | слева направо |
| < <= > >= | слева направо |
| == != | слева направо |
| & | слева направо |
| ^ | слева направо |
| | | слева направо |
| && | слева направо |
| || | слева направо |
| ?: | справа налево |
| = += -= *= /= %= &= ^= |= <<= >>= | справа налево |
| , | слева направо |