Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

Операторы в C: полное руководство по арифметическим, битовым, логическим и другим операторам

Классификация операторов

Операторы в C делятся на категории по функции и количеству операндов:

Арифметические операторы

Предположим int a = 10, b = 20;

ОператорИмяПримерРезультат
+Сложениеa + b30
-Вычитаниеa - b-10
*Умножениеa * b200
/Делениеb / a2 (целочисленное!)
%Остаток от деленияb % a0
++Инкремент++a (префикс) / a++ (постфикс)11 / 10 (значение выражения)
--Декремент--a / a--9 / 10

Важно: целочисленное деление отбрасывает дробную часть. 5 / 2 == 2. Для дробного — приведите к float: (float)a / b.

Операторы присваивания

ОператорЭквивалентПример
=c = a + bПрисваивание
+=c = c + aСложение с присваиванием
-=c = c - aВычитание с присваиванием
*=c = c * aУмножение с присваиванием
/=c = c / aДеление с присваиванием
%=c = c % aОстаток с присваиванием
<<=c = c << 2Сдвиг влево с присваиванием
>>=c = c >> 2Сдвиг вправо с присваиванием
&=c = c & 2Побитовое И с присваиванием
^=c = c ^ 2Побитовое XOR с присваиванием
|=c = c | 2Побитовое ИЛИ с присваиванием

Операторы отношения (сравнения)

Возвращают int: 1 (истина) или 0 (ложь). a=10, b=20:

ОператорСмыслПримерРезультат
==Равноa == b0
!=Не равноa != b1
>Большеa > b0
<Меньшеa < b1
>=Больше или равноa >= b0
<=Меньше или равноa <= b1

Логические операторы

Операнды: 0 = ложь, не-0 = истина. Результат: 1 или 0. Короткое замыкание (short-circuit) — второй операнд не вычисляется, если результат определён первым.

ОператорИмяПример (a=1, b=0)Результат
&&Логическое Иa && b0
||Логическое ИЛИa || b1
!Логическое НЕ!a0

Пример короткого замыкания:

if (ptr != NULL && ptr->len > 0) // ptr->len не вычислится, если ptr == NULL
if (file = fopen(...)) { ... }   // присваивание В условии — идиома

Битовые операторы

Работают с отдельными битами целых чисел. a = 60 (0011 1100), b = 13 (0000 1101):

ОператорИмяПримерРезультат (bin)Результат (dec)
&Побитовое И (AND)a & b0000 110012
|Побитовое ИЛИ (OR)a | b0011 110161
^Побитовое XOR (искл. ИЛИ)a ^ b0011 000149
~Побитовое НЕ (NOT, унарный)~a1100 0011-61 (дополнение до 2)
<<Сдвиг влевоa << 21111 0000240
>>Сдвиг вправоa >> 20000 111115

Важно: сдвиг отрицательных чисел — implementation-defined (обычно арифметический сдвиг с сохранением знака). Сдвиг на ≥ ширину типа — UB.

Разные важные операторы

ОператорИмяОписаниеПример
sizeofРазмер типа/выраженияВозвращает size_t (байты). Вычисляется на этапе компиляции (кроме VLA).sizeof(int), sizeof x
&Взятие адресаУнарный. Возвращает указатель на объект.&x
*РазыменованиеУнарный. Доступ к значению по адресу.*ptr
?:Тернарный (условный)cond ? expr1 : expr2. Если cond истинно → expr1, иначе expr2.max = (a > b) ? a : b;
,ЗапятаяВычисляет слева направо, значение — последнее выражение.for (i=0, j=10; i<j; i++, j--)
. ->Доступ к членуСтруктура / указатель на структуру.s.member, p->member
[]Индексацияarr[i] ≡ *(arr + i).arr[5]
(type)Приведение типа (cast)Явное преобразование.(float)a / b

Приоритет и ассоциативность

Выше в таблице — выше приоритет. Операторы одного приоритета группируются по ассоциативности.

ПриоритетОператорыАссоциативность
1 (высший)() [] . -> ++ -- (постфикс)←
2++ -- + - ! ~ (type) * & sizeof (унарные)→
3* / %←
4+ -←
5<< >>←
6< <= > >=←
7== !=←
8&←
9^←
10|←
11&&←
12||←
13?:→
14= += -= *= /= %= <<= >>= &= ^= |=→
15 (низший),←

Примеры приоритета

x = 7 + 3 * 2;     // * выше + → x = 7 + 6 = 13
x = (7 + 3) * 2;   // скобки меняют порядок → x = 20
a = b = c = 0;     // = правоассоциативен → a = (b = (c = 0))
*p++               // постфикс ++ выше * → *(p++) — разыменовать, потом инкремент указателя
(*p)++             // скобки: (*p)++ — инкремент значения

Приведение типов (type conversions)

Undefined Behavior (UB) с операторами

Санитайзеры (-fsanitize=undefined) помогают ловить UB в runtime.

Язык C

  1. Операторы C# — исчерпывающее руководство по операторам в C#
  2. Освоение побитовых и сдвиговых операторов в C#: полное руководство
  3. Освоение операторов C++: полное руководство с практическими примерами
  4. Операторы в C: исчерпывающее руководство
  5. Мастерство операторов Python: Полное руководство
  6. Освоение операторов Java: типы, синтаксис и практические примеры
  7. Побитовые операторы в C: И, ИЛИ, XOR, сдвиги и дополнение — подробно
  8. Операторы Verilog: основная арифметика и управление для синтеза
  9. Основные операторы Java: полное руководство
  10. Полное руководство по операторам C++: типы, использование и лучшие практики