Переменные в C++
Переменные позволяют хранить данные, которые программа использует во время выполнения. Это могут быть числа, текст, логические значения и другие виды информации.
Например, переменная может хранить здоровье персонажа, имя пользователя, количество очков или текущую скорость объекта.
Что такое переменная
Переменная — это именованная область памяти, в которой хранится значение определённого типа.
int age = 18;В этом примере:
int— тип данных, определяющий, что переменная хранит целое число.age— имя переменной.18— начальное значение.
Теперь программа может обращаться к переменной age, чтобы получить или изменить сохранённое значение.
#include <iostream>int main() { int age = 18; std::cout << age << '\n'; return 0;}Вывод:
18Объявление переменных
Чтобы создать переменную, необходимо указать её тип и имя. При необходимости сразу можно присвоить ей начальное значение.
int score; // Объявление без начального значенияint health = 100; // Объявление с начальным значениемВ первом случае переменная score объявлена, но её значение не задано. Для локальной переменной встроенного типа это означает, что её нельзя безопасно читать до присваивания значения.
Во втором случае health сразу получает значение 100.
Можно также объявить несколько переменных одного типа:
int x = 10;int y = 20;int z = 30;Или записать несколько объявлений в одной строке:
int x = 10, y = 20, z = 30;Для начинающих отдельные объявления обычно удобнее: так проще читать код и изменять его.
Основные типы данных
В C++ тип переменной определяет, какие значения она может хранить и какие операции с ней доступны.
Целые числа — int
Используются для хранения целых чисел без дробной части.
int age = 25;int score = 1500;int temperature = -10;Тип int подходит для счётчиков, количества предметов, очков и других целочисленных значений.
Дробные числа — float и double
Эти типы позволяют хранить числа с дробной частью.
float speed = 4.5f;double distance = 125.75;float обычно занимает меньше памяти, но имеет меньшую точность. double обеспечивает более высокую точность и часто используется по умолчанию для вычислений с дробными числами.
Обрати внимание на суффикс f в записи 4.5f: он указывает, что литерал имеет тип float.
Символы — char
Тип char предназначен для хранения одного символа из базового набора символов исполнения.
char grade = 'A';char operation = '+';Символ записывается в одинарных кавычках. Запись 'A' отличается от "A", которая представляет строковый литерал.
Логические значения — bool
Переменная типа bool может принимать только два значения: true и false.
bool isAlive = true;bool isPaused = false;Такие переменные полезны для хранения состояний и результатов проверок.
int health = 0;bool isAlive = health > 0;std::cout << isAlive << '\n';При стандартных настройках потока программа выведет 0, поскольку выражение health > 0 ложно.
Строки — std::string
Для хранения текста в стандартной библиотеке C++ существует тип std::string.
#include <string>std::string name = "Alex";std::string message = "Привет, мир!";Чтобы использовать std::string, необходимо подключить заголовок <string>.
Изменение значения переменной
После объявления переменной её значение можно менять с помощью оператора присваивания =.
int score = 100;score = 250;После второй строки переменная score содержит 250, а не 100.
Для изменения текущего значения также можно использовать составные операторы присваивания:
int coins = 10;coins += 5; // coins = coins + 5coins -= 3; // coins = coins - 3coins *= 2; // coins = coins * 2coins /= 4; // coins = coins / 4В результате переменная coins будет содержать 6.
Если переменная имеет целочисленный тип, деление двух целых чисел отбрасывает дробную часть:
int result = 7 / 2;std::cout << result << '\n';Вывод:
3Чтобы получить дробный результат, хотя бы один из операндов должен иметь дробный тип:
double result = 7.0 / 2;std::cout << result << '\n';Вывод:
3.5Инициализация и присваивание
Инициализация — это задание начального значения при создании переменной. Присваивание — изменение значения уже существующей переменной.
int health = 100; // Инициализацияhealth = 75; // ПрисваиваниеВ C++ также доступны другие формы инициализации:
int a = 10;int b(20);int c{30};Форма с фигурными скобками c{30} особенно полезна тем, что запрещает некоторые небезопасные преобразования типов.
Например, следующий код не скомпилируется:
int value{3.14};Компилятор сообщит об ошибке, поскольку дробное значение нельзя без потери данных преобразовать в int при такой инициализации.
Константные переменные
Иногда значение должно оставаться неизменным после создания переменной. Для этого используется ключевое слово const.
const int maxHealth = 100;const double pi = 3.14159;После инициализации изменить такую переменную нельзя:
const int maxHealth = 100;maxHealth = 200; // Ошибка компиляцииconst помогает защитить данные от случайных изменений и показывает назначение значения в коде.
Если значение известно во время компиляции и подходит для вычисления на этапе компиляции, можно использовать constexpr:
constexpr int windowWidth = 1280;constexpr int windowHeight = 720;constexpr применяется для значений, которые должны быть константными выражениями.
Правила именования переменных
Имена переменных должны быть понятными и соответствовать правилам языка.
Допустимые примеры:
int playerHealth = 100;int enemy_count = 5;double movementSpeed = 3.5;bool isGameRunning = true;Основные правила:
- Имя может содержать латинские буквы, цифры и символ подчёркивания
_. - Имя не может начинаться с цифры.
- Пробелы в имени не допускаются.
- Регистр имеет значение:
scoreиScore— разные имена. - Ключевые слова C++ нельзя использовать в качестве имён переменных.
- Лучше выбирать имена, которые объясняют назначение значения.
Например, вместо короткого и неочевидного имени x в подходящем контексте лучше использовать playerPositionX.
Плохой пример:
int a = 100;int b = 5;int c = a - b;Более понятный вариант:
int playerHealth = 100;int damage = 5;int remainingHealth = playerHealth - damage;Второй вариант легче читать и поддерживать.
Автоматическое определение типа с auto
Ключевое слово auto позволяет компилятору определить тип переменной по начальному значению.
auto age = 18; // intauto speed = 4.5; // doubleauto name = "Alex"; // const char*Тип определяется по правилам вывода типов C++. Например, литерал 4.5 имеет тип double, а строковый литерал "Alex" в данном случае не создаёт объект std::string.
Если требуется именно строка std::string, можно написать:
#include <string>auto name = std::string{"Alex"};auto особенно полезен, когда тип сложный или очевиден из правой части выражения. Однако не стоит применять его повсюду, если явное указание типа делает код понятнее.
Область видимости переменных
Область видимости определяет, в какой части программы можно обращаться к переменной.
Локальная переменная, объявленная внутри блока {}, доступна в пределах этого блока и вложенных блоков.
#include <iostream>int main() { int score = 100; { int bonus = 50; score += bonus; } std::cout << score << '\n'; return 0;}Вывод:
150Переменная bonus существует только внутри вложенного блока. Попытка обратиться к ней после закрывающей фигурной скобки приведёт к ошибке компиляции.
int main() { { int bonus = 50; } // std::cout << bonus; // Ошибка: bonus вне области видимости return 0;}Пример: использование переменных в программе
Объединим несколько типов данных в небольшой программе:
#include <iostream>#include <string>int main() { std::string playerName = "Alex"; int health = 100; int damage = 25; bool isAlive = true; health -= damage; isAlive = health > 0; std::cout << "Игрок: " << playerName << '\n'; std::cout << "Здоровье: " << health << '\n'; std::cout << "Жив: " << isAlive << '\n'; return 0;}Результат выполнения:
Игрок: AlexЗдоровье: 75Жив: 1Здесь playerName хранит имя игрока, health — его здоровье, damage — величину урона, а isAlive — результат проверки, осталось ли у игрока здоровье.
По умолчанию std::cout выводит логическое значение true как 1, а false как 0. Чтобы выводить слова true и false, можно использовать std::boolalpha.
Частые ошибки
Использование неинициализированной переменной
int score;std::cout << score; // Ошибка логики: значение не заданоДля локальной переменной int чтение до инициализации приводит к неопределённому поведению.
Правильный вариант:
int score = 0;std::cout << score;Несовместимые типы данных
int age = "18"; // Ошибка компиляцииСтроковый литерал нельзя напрямую присвоить переменной типа int.
Правильный вариант:
int age = 18;Потеря дробной части
int price = 19.99;Такое преобразование отбрасывает дробную часть значения. Если требуется хранить дробные числа, используй double:
double price = 19.99;Повторное объявление переменной в одной области видимости
int score = 10;int score = 20; // ОшибкаВ одной области видимости нельзя повторно объявить локальную переменную с тем же именем.
Чтобы изменить значение, используй присваивание:
int score = 10;score = 20;Итог
- Переменные хранят данные, которые используются программой.
- При объявлении указываются тип и имя переменной.
- Тип данных определяет, какие значения можно хранить.
- Оператор
=используется для инициализации и присваивания. constзащищает значение от изменения, аconstexprпозволяет задавать константы времени компиляции.autoпомогает компилятору определить тип по начальному значению.- Область видимости определяет, где переменная доступна.
- Понятные имена инициализированные значения делают код безопаснее и проще для чтения.
