мета-данные страницы
Различия
Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| c:c_ultimate_guide:operators [2025/10/09 13:16] – создано radi0dev | c:c_ultimate_guide:operators [2025/11/09 12:07] (текущий) – внешнее изменение A User Not Logged in | ||
|---|---|---|---|
| Строка 35: | Строка 35: | ||
| Унарный оператор: | Унарный оператор: | ||
| * '' | * '' | ||
| + | |||
| + | ===== Операторы присвоения ===== | ||
| + | |||
| + | |||
| + | представляют из себя сокрашенные выражения | ||
| + | |||
| + | ++++список| | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * ''/ | ||
| + | * '' | ||
| + | * ''<< | ||
| + | * ''>> | ||
| + | * ''& | ||
| + | * '' | ||
| + | * '' | ||
| + | ++++ | ||
| + | |||
| + | ===== Операторы сдвига ===== | ||
| + | |||
| + | Каждое целое число в памяти представлено в виде определенного количества разрядов. И операции сдвига позволяют сдвинуть битовое представление числа на несколько разрядов вправо или влево. Операции сдвига применяются __только к целочисленным__ операндам. | ||
| + | |||
| + | * ''<<'' | ||
| + | * ''>>'' | ||
| + | |||
| + | <code c> | ||
| + | int a = 2 << 2; // 0b10 на два разрядов влево = 0b1000 = 8 | ||
| + | int b = 16 >> 3; // 0b10000 на три разряда вправо = 0b10 = 2 | ||
| + | </ | ||
| + | |||
| + | ===== Поразрядные операции ===== | ||
| + | |||
| + | Поразрядные операции также проводятся только над разрядами __целочисленных__ операндов. | ||
| + | |||
| + | * ''&'' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | <code c> | ||
| + | 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 | ||
| + | </ | ||
| ===== Преобразования типов ===== | ===== Преобразования типов ===== | ||
| + | В ряде случаев преобразования сопровождаются потерей информации, | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | ++++пример потери данных| | ||
| + | <code c> | ||
| + | #include < | ||
| + | | ||
| + | int main(void){ | ||
| + | int number1 = 300; | ||
| + | char code = number1; // потеря точности - число number1 усекается до 1 байта | ||
| + | printf(" | ||
| + | | ||
| + | short number2 = 100000; // потеря точности - число 100000 усекается до 2 байт | ||
| + | printf(" | ||
| + | | ||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Число 300 в двоичной системе = 0000000100101100, | ||
| + | ++++ | ||
| + | |||
| + | ==== Неявное преобразование ==== | ||
| + | |||
| + | Преобразования, | ||
| + | |||
| + | - Если один из операндов имеет тип long double, то второй операнд тоже будет преобразован в тип long double | ||
| + | - Если предыдущий пункт не выполняется и если один из операндов имеет тип double, то второй операнд тоже будет преобразован к типу double | ||
| + | - Если предыдущий пункт не выполняется и если один из операндов имеет тип float, то второй операнд тоже будет преобразован к типу float | ||
| + | - Если предыдущий пункт не выполняется и если один из операндов имеет тип unsigned long int, то второй операнд тоже будет преобразован к типу unsigned long int | ||
| + | - Если предыдущий пункт не выполняется и если один из операндов имеет тип long, то второй операнд тоже будет преобразован к типу long | ||
| + | - Если предыдущий пункт не выполняется и если один из операндов имеет тип unsigned, то второй операнд тоже будет преобразован к типу unsigned | ||
| + | - Если предыдущий пункт не выполняется то оба операнда приводятся к типу int | ||
| + | |||
| + | ==== Явное преобразование ==== | ||
| + | |||
| + | Явное преобразование происходит через операторы преобразования: | ||
| + | <code c> | ||
| + | int a = 10; | ||
| + | int b = 4; | ||
| + | int c = a / b; | ||
| + | double d = a / b; | ||
| + | double e = (double)a / (double)b; | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | |||
| + | int number = 70; | ||
| + | char symbol = (char) number; | ||
| + | printf(" | ||
| + | printf(" | ||
| + | </ | ||
| + | ===== Приоритет и очередность ===== | ||
| + | ^ Операторы ^ Выполняются ^ | ||
| + | |%% () [] -> . %%| слева направо | | ||
| + | |%% ! ~ ++ -- + - * & (тип) sizeof %%| справа налево | | ||
| + | |%% * / % %%| слева направо | | ||
| + | |%% + - %%| слева направо | | ||
| + | |%% << >> %%| слева направо | | ||
| + | |%% < <= > >= %%| слева направо | | ||
| + | |%% == != %%| слева направо | | ||
| + | |%% & %%| слева направо | | ||
| + | |%% ^ %%| слева направо | | ||
| + | |%% | %%| слева направо | | ||
| + | |%% && %%| слева направо | | ||
| + | |%% || %%| слева направо | | ||
| + | |%% ?: %%| справа налево | | ||
| + | |%% = += -= *= /= %= &= ^= |= <<= >>= %%| справа налево | | ||
| + | |%% , %%| слева направо | | ||
| + | < | ||
| + | Примечание. Унарные операторы +, -, * и & имеют более высокий приоритет, | ||
| + | операторы. | ||
| + | </ | ||