Перейти к основному содержимому

Операции присваивания

Простое присваивание

Оператор присваивания = помещает значение в переменную.

int age = 25;        // Инициализация при объявлении
age = 30; // Изменение существующей переменной
age = age + 5; // Использование текущего значения

Базовый синтаксис

#include <stdio.h>

int main() {
int score; // Объявление
score = 100; // Присваивание значения

printf("Счет: %d\n", score);

score = 85; // Новое значение
printf("Новый счет: %d\n", score);

return 0;
}

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

Сокращенные формы для модификации переменных.

ОператорЭквивалентОписаниеПример
+=a = a + bПрибавить и присвоитьx += 5
-=a = a - bВычесть и присвоитьx -= 3
*=a = a * bУмножить и присвоитьx *= 2
/=a = a / bРазделить и присвоитьx /= 4
%=a = a % bОстаток и присвоитьx %= 7

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

#include <stdio.h>

int main() {
int balance = 1000;

printf("Начальный баланс: %d\n", balance);

balance += 500; // Пополнение счета
printf("После пополнения: %d\n", balance);

balance -= 200; // Покупка
printf("После покупки: %d\n", balance);

balance *= 2; // Удваиваем бонусом
printf("После бонуса: %d\n", balance);

balance /= 4; // Берем четверть
printf("Финальный баланс: %d\n", balance);

return 0;
}

Поразрядные составные операции

Комбинируют поразрядные операции с присваиванием.

ОператорЭквивалентОписание
&=a = a & bПоразрядное И и присвоить
|=a = a | bПоразрядное ИЛИ и присвоить
^=a = a ^ bИсключающее ИЛИ и присвоить
<<=a = a << bСдвиг влево и присвоить
>>=a = a >> bСдвиг вправо и присвоить

Примеры поразрядного присваивания

#include <stdio.h>

int main() {
int flags = 5; // 101 в двоичном виде

printf("Исходные флаги: %d\n", flags);

flags |= 2; // Устанавливаем второй бит: 101 | 010 = 111
printf("После flags |= 2: %d\n", flags);

flags &= 6; // Маскируем: 111 & 110 = 110
printf("После flags &= 6: %d\n", flags);

flags ^= 4; // Переключаем третий бит: 110 ^ 100 = 010
printf("После flags ^= 4: %d\n", flags);

return 0;
}

Операторы сдвига с присваиванием

int number = 3;  // 011

printf("Исходное число: %d\n", number);

number <<= 1; // 110 = 6
printf("После <<= 1: %d\n", number);

number <<= 2; // 11000 = 24
printf("После <<= 2: %d\n", number);

Множественное присваивание

int a, b, c;

// Присваивание одного значения нескольким переменным
a = b = c = 10;

printf("a = %d, b = %d, c = %d\n", a, b, c); // 10, 10, 10

// Цепочка вычислений
int x = 5;
int y = (x += 3) * 2; // x становится 8, y становится 16

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

Возвращаемое значение присваивания

Операция присваивания возвращает присвоенное значение:

int a, b;

if ((a = 10) > 5) { // a получает 10, затем проверяется условие
printf("a больше 5\n");
}

printf("a = %d\n", a); // 10

// Полезно для инициализации в условиях
while ((b = getNumber()) != 0) { // Псевдокод
printf("Обрабатываем число: %d\n", b);
}

Практические примеры

Счетчики и накопители

#include <stdio.h>

int main() {
int totalScore = 0;
int gamesPlayed = 0;

// Симуляция результатов игр
int gameResults[] = {85, 92, 78, 95, 88};
int numberOfGames = 5;

for (int i = 0; i < numberOfGames; i++) {
totalScore += gameResults[i]; // Накапливаем сумму
gamesPlayed++; // Увеличиваем счетчик

printf("Игра %d: %d очков\n", gamesPlayed, gameResults[i]);
}

float average = (float)totalScore / gamesPlayed;
printf("---------------------------\n");
printf("Всего игр: %d\n", gamesPlayed);
printf("Общий счет: %d\n", totalScore);
printf("Средний результат: %.1f\n", average);

return 0;
}

Управление флагами состояния

#include <stdio.h>

#define LOGGED_IN 1 // 001
#define HAS_PREMIUM 2 // 010
#define IS_ADMIN 4 // 100

int main() {
int userStatus = 0; // Начальное состояние

// Пользователь входит в систему
userStatus |= LOGGED_IN;
printf("Пользователь вошел в систему\n");

// Покупает премиум
userStatus |= HAS_PREMIUM;
printf("Премиум активирован\n");

// Проверяем статус
printf("\n=== СТАТУС ПОЛЬЗОВАТЕЛЯ ===\n");
printf("Авторизован: %s\n", (userStatus & LOGGED_IN) ? "Да" : "Нет");
printf("Премиум: %s\n", (userStatus & HAS_PREMIUM) ? "Да" : "Нет");
printf("Админ: %s\n", (userStatus & IS_ADMIN) ? "Да" : "Нет");

// Отзываем премиум
userStatus &= ~HAS_PREMIUM;
printf("\nПремиум отозван\n");
printf("Премиум активен: %s\n", (userStatus & HAS_PREMIUM) ? "Да" : "Нет");

return 0;
}

Часто встречающиеся ошибки

Распространенные проблемы
// ❌ Путаница = и ==
int x = 5;
if (x = 10) { // Присваивание вместо сравнения!
printf("Условие всегда истинно\n");
}

// ✅ Правильно
if (x == 10) {

// ❌ Неопределенное поведение
int i = 5;
i = i++ + ++i; // Результат непредсказуем!

// ❌ Деление на ноль в составном операторе
int x = 10;
x /= 0; // Ошибка выполнения!
Рекомендации
  • Избегайте сложных выражений с множественными присваиваниями
  • Используйте составные операторы для ясности: x += 1 понятнее чем x = x + 1
  • Будьте осторожны с операторами ++ и -- в сложных выражениях
  • Проверяйте деление на ноль перед использованием /= и %=

Операции присваивания — основной способ изменения данных в программах на языке Си.