Операторы C: Ваше введение в магию программирования

Привет, будущие маги кодирования! ? Я рад быть вашим проводником в этом увлекательном путешествии по миру программирования на языке C. Сегодня мы погрузимся в мир операторов в C. Не волнуйтесь, если вы никогда не писали ни одной строки кода – мы начнем с самого начала и будем развиваться вместе.

C - Operators

Арифметические операторы: Основные заклинания

Начнем с самых простых заклинаний в нашей книге заклинаний программирования – арифметические операторы. Это основные блоки большинства вычислений в C.

Пятерка арифметики

Вот пять основных арифметических операторов:

Оператор Название Пример
+ Сложение 5 + 3 = 8
- Вычитание 7 - 2 = 5
* Умножение 4 * 6 = 24
/ Деление 10 / 2 = 5
% Остаток от деления 7 % 3 = 1

Давайте посмотрим, как они работают:

#include <stdio.h>

int main() {
int a = 10, b = 3;

printf("Сложение: %d\n", a + b);
printf("Вычитание: %d\n", a - b);
printf("Умножение: %d\n", a * b);
printf("Деление: %d\n", a / b);
printf("Остаток от деления: %d\n", a % b);

return 0;
}

При выполнении этого кода вы увидите:

Сложение: 13
Вычитание: 7
Умножение: 30
Деление: 3
Остаток от деления: 1

Заметьте, как деление дает нам 3 вместо 3.33? Это происходит потому, что при делении целых чисел в C мы получаем целое значение. Оператор остатка (%) дает нам остаток от деления.

Реляционные операторы: Сравнение яблок и апельсинов

Теперь, когда мы можем выполнять основные математические операции, давайте научимся сравнивать вещи. Реляционные операторы – это как судьи на конкурсе талантов – они сравнивают два значения и сообщают нам, как они относятся друг к другу.

Вот наши реляционные операторы:

Оператор Значение Пример
== Равно 5 == 5 – истина
!= Не равно 5 != 3 – истина
> Больше 7 > 3 – истина
< Меньше 2 < 8 – истина
>= Больше или равно 5 >= 5 – истина
<= Меньше или равно 4 <= 4 – истина

Давайте применим их:

#include <stdio.h>

int main() {
int x = 5, y = 8;

printf("x == y: %d\n", x == y);
printf("x != y: %d\n", x != y);
printf("x > y: %d\n", x > y);
printf("x < y: %d\n", x < y);
printf("x >= y: %d\n", x >= y);
printf("x <= y: %d\n", x <= y);

return 0;
}

Это выведет:

x == y: 0
x != y: 1
x > y: 0
x < y: 1
x >= y: 0
x <= y: 1

В C 0 означает ложь, а любое не нулевое значение (обычно 1) означает истину. Таким образом, мы можем увидеть, что 5 действительно не равен 8, и он меньше 8.

Логические операторы: Мakers решений

Логические операторы – это как мудрые старцы нашего программного поселения. Они помогают нам делать сложные решения, комбинируя более простые условия.

Вот наши логические операторы:

Оператор Значение Пример
&& И (5 > 3) && (4 < 7) – истина
|| ИЛИ (5 > 8) || (4 < 7) – истина
! НЕ !(5 > 8) – истина

Давайте посмотрим, как они работают:

#include <stdio.h>

int main() {
int a = 5, b = 3, c = 8;

printf("(a > b) && (c > a): %d\n", (a > b) && (c > a));
printf("(a > b) || (a > c): %d\n", (a > b) || (a > c));
printf("!(a > b): %d\n", !(a > b));

return 0;
}

Это выведет:

(a > b) && (c > a): 1
(a > b) || (a > c): 1
!(a > b): 0

Оператор И (&&) возвращает истину только если оба условия истинны. Оператор ИЛИ (||) возвращает истину, если хотя бы одно условие истинно. Оператор НЕ (!) инвертирует истинное значение.

Битовые операторы: Маги бинарных чисел

Теперь мы входим в область бинарной магии. Битовые операторы работают напрямую с бинарными представлениями чисел. Они похожи на микроскопы в мире программирования, позволяя нам видеть и манипулировать отдельными битами.

Вот наши битовые операторы:

Оператор Название Пример
& Побитовое И 5 & 3 = 1
| Побитовое ИЛИ 5 | 3 = 7
^ Побитовое Исключающее ИЛИ 5 ^ 3 = 6
~ Побитовое НЕ ~5 = -6
<< Сдвиг влево 5 << 1 = 10
>> Сдвиг вправо 5 >> 1 = 2

Давайте посмотрим, как они работают:

#include <stdio.h>

int main() {
unsigned int a = 5, b = 3;  // 5 равен 101 в двоичной системе, 3 равен 011

printf("a & b = %u\n", a & b);   // 101 & 011 = 001
printf("a | b = %u\n", a | b);   // 101 | 011 = 111
printf("a ^ b = %u\n", a ^ b);   // 101 ^ 011 = 110
printf("~a = %d\n", ~a);         // ~101 = ...11111010 (двойное дополнение)
printf("a << 1 = %u\n", a << 1); // 101 становится 1010
printf("a >> 1 = %u\n", a >> 1); // 101 становится 10

return 0;
}

Это выведет:

a & b = 1
a | b = 7
a ^ b = 6
~a = -6
a << 1 = 10
a >> 1 = 2

Эти операторы особенно полезны при работе с низкоуровневым программированием или при оптимизации вашего кода.

Операторы присваивания: Изменители значений

Операторы присваивания – это как писатели нашего программного мира. Они записывают (или присваивают) значения переменным. Давайте познакомимся с нашими операторами присваивания:

Оператор Пример Эквивалентно
= x = 5 x = 5
+= x += 3 x = x + 3
-= x -= 2 x = x - 2
*= x *= 4 x = x * 4
/= x /= 2 x = x / 2
%= x %= 3 x = x % 3
<<= x <<= 2 x = x << 2
>>= x >>= 1 x = x >> 1
&= x &= 3 x = x & 3
^= x ^= 5 x = x ^ 5
|= x |= 3 x = x | 3

Вот краткий пример:

#include <stdio.h>

int main() {
int x = 10;

x += 5;  // x теперь равен 15
printf("После x += 5: %d\n", x);

x *= 2;  // x теперь равен 30
printf("После x *= 2: %d\n", x);

x %= 7;  // x теперь равен 2 (30 % 7 = 2)
printf("После x %%= 7: %d\n", x);

return 0;
}

Это выведет:

После x += 5: 15
После x *= 2: 30
После x %%= 7: 2

Эти операторы являются сокращениями, которые делают наш код более кратким и часто более читаемым.

Прочие операторы: Спецназ

Теперь познакомимся с некоторыми специальными операторами, которые не вписываются в наши другие категории.

Оператор sizeof

Оператор sizeof сообщает нам размер переменной или типа данных в байтах. Он похож на мерачный трос для наших данных.

#include <stdio.h>

int main() {
int x;
char c;
float f;

printf("Размер int: %zu байт\n", sizeof(x));
printf("Размер char: %zu байт\n", sizeof(c));
printf("Размер float: %zu байт\n", sizeof(f));

return 0;
}

Это может вывести (в зависимости от вашей системы):

Размер int: 4 байта
Размер char: 1 байт
Размер float: 4 байта

Тернарный оператор

Тернарный оператор – это как компактная форма if-else. Он записывается как condition ? value_if_true : value_if_false.

#include <stdio.h>

int main() {
int x = 10;
int y = (x > 5) ? 1 : 0;

printf("y = %d\n", y);

return 0;
}

Это выведет:

y = 1

Потому что x больше 5, y присваивается значение 1.

Приоритет операций в C: Иерархия

Так же, как и в математике, в C есть иерархия операций. Эта иерархия определяет, какие операции выполняются первыми, когда используются несколько операторов в одном выражении.

Вот упрощенная таблица приоритетов, от высших к низшим:

Приоритет Оператор
1 () [] -> .
2 ! ~ ++ -- + - * & (type) sizeof
3 * / %
4 + -
5 << >>
6 < <= > >=
7 == !=
8 &
9 ^
10 |
11 &&
12 ||
13 ?:
14 = += -= *= /= %= &= ^= |= <<= >>=
15 ,

Помните, если у вас есть сомнения, используйте скобки, чтобы сделать ваши намерения яснее!

Другие операторы в C: Сокровища

Есть еще несколько операторов в C, которые мы не обсуждали:

  1. Оператор запятая (,): Он позволяет использовать несколько выражений, где ожидается только одно.
  2. Оператор адреса (&): Он возвращает адрес памяти переменной.
  3. Оператор dereference (*): Он доступает к значению по конкретному адресу памяти.
  4. Оператор член структуры (.): Он доступает к членам структуры.
  5. Оператор указатель на член структуры (->): Он доступает к членам структуры через указатель.

Мы разберем эти операторы более подробно, когда погружемся в указатели и структуры в будущих уроках.

Итак, вот и все! Мы погружались в мир операторов в C, от простых арифметических заклинаний до сложных битовых манипуляций. Помните, практика – это ключ к совершенству, так что не стесняйтесь экспериментировать с этими операторами в своем коде. Счастливого кодирования, и май будь с вами в пользу! ?‍♂️?

Credits: Image by storyset