⚙️ C++
条件语句 (if/else/switch) 在 C++17 中:详细指南
Переменные и типы данных C++: полное руководство с примерами
Переменные — именованные ячейки памяти для хранения данных. Тип данных определяет сколько памяти занимает переменная и какие операции над ней возможны.
Основные типы данных
#include <iostream>
#include <string>
using namespace std;
int main() {
// Целые числа
int age = 25; // 4 байта, ≈ ±2 миллиарда — ОСНОВНОЙ ТИП
short code = 1000; // 2 байта, ≈ ±32000
long bigPop = 8000000000L; // 4 или 8 байт
long long hugeNum = 9223372036854775807LL; // 8 байт
// Числа с плавающей точкой
float price = 99.99f; // 4 байта, ~7 знаков
double pi = 3.14159265358979; // 8 байт, ~15 знаков — РЕКОМЕНДУЕТСЯ!
// Символ
char letter = 'A'; // 1 байт, ОДИНАРНЫЕ кавычки!
// Строка (из )
string name = "Иван Петров"; // Удобная строка std::string
// Логический тип
bool active = true; // true или false
bool done = false;
cout << "Имя: " << name << endl;
cout << "Возраст: " << age << endl;
cout << "Pi: " << pi << endl;
cout << boolalpha << "Активен: " << active << endl; // boolalpha: true/false
return 0;
}
Размеры типов: sizeof
#include <iostream>
#include <climits> // INT_MIN, INT_MAX и другие
#include <cfloat> // FLT_MAX, DBL_MAX
using namespace std;
int main() {
cout << "Размеры типов:" << endl;
cout << " char: " << sizeof(char) << " байт" << endl; // 1
cout << " short: " << sizeof(short) << " байт" << endl; // 2
cout << " int: " << sizeof(int) << " байт" << endl; // 4
cout << " long: " << sizeof(long) << " байт" << endl; // 4 или 8
cout << " long long: " << sizeof(long long) << " байт" << endl; // 8
cout << " float: " << sizeof(float) << " байт" << endl; // 4
cout << " double: " << sizeof(double) << " байт" << endl; // 8
cout << " bool: " << sizeof(bool) << " байт" << endl; // 1
cout << "
Диапазоны int:" << endl;
cout << " min: " << INT_MIN << endl; // -2147483648
cout << " max: " << INT_MAX << endl; // 2147483647
cout << "
Диапазоны long long:" << endl;
cout << " max: " << LLONG_MAX << endl; // 9223372036854775807
return 0;
}
Объявление и инициализация
#include <iostream>
using namespace std;
int main() {
// Стиль 1: классический
int score = 100;
double temp = 36.6;
// Стиль 2: прямая инициализация (C++11)
int x(42);
double y(3.14);
// Стиль 3: списковая инициализация (C++11, рекомендуется!)
int a{10};
double b{2.71};
// Преимущество: предотвращает сужающие преобразования
// int c{3.14}; // ОШИБКА: нельзя double→int без явного приведения
// Стиль 4: auto — компилятор выводит тип сам (C++11)
auto n = 42; // int
auto pi = 3.14; // double
auto ch = 'A'; // char
auto flag = true; // bool
auto msg = string("Привет"); // string
// Несколько переменных одного типа
int i = 0, j = 0, k = 0;
// Объявление без инициализации (ОСТОРОЖНО: содержит мусор!)
int uninitialized; // Опасно! Может содержать любое значение
// cout << uninitialized; // Неопределённое поведение!
// Правило: всегда инициализируйте переменные!
int safeVar = 0;
cout << "score=" << score << ", n=" << n << ", pi=" << pi << endl;
return 0;
}
Константы: const и constexpr
#include <iostream>
#include <cmath>
using namespace std;
// Константы компиляции (лучший вариант в C++11+)
constexpr double PI = 3.14159265358979;
constexpr int MAX_LIVES = 3;
constexpr int MAX_SCORE = 10000;
// Макроконстанты (старый стиль, избегайте)
// #define OLD_PI 3.14 // Без типа, без области видимости — плохо
int main() {
// Локальная константа
const double GRAVITY = 9.81;
const string APP_NAME = "SuperGame";
cout << "PI = " << PI << endl;
cout << "Жизней: " << MAX_LIVES << endl;
cout << "Гравитация: " << GRAVITY << endl;
// PI = 3.14; // ОШИБКА: assignment of read-only variable 'PI'
// constexpr позволяет вычисления при компиляции
constexpr double CIRCLE_AREA = PI * 5 * 5; // Вычислено при компиляции!
cout << "Площадь круга r=5: " << CIRCLE_AREA << endl;
return 0;
}
Переполнение: что будет если int = 3 миллиарда?
#include <iostream>
#include <climits>
using namespace std;
int main() {
int maxInt = INT_MAX;
cout << "INT_MAX = " << maxInt << endl; // 2147483647
cout << "INT_MAX + 1 = " << maxInt + 1 << endl; // -2147483648 ПЕРЕПОЛНЕНИЕ!
// Числа "оборачиваются" — это как спидометр 99999 → 00000
// Безопасный вариант: используйте long long
long long bigNum = (long long)maxInt + 1;
cout << "Long long: " << bigNum << endl; // 2147483648 — правильно
// Беззнаковые типы: unsigned
unsigned int u = 0;
u = u - 1; // Wrap-around: становится 4294967295 (максимум unsigned int)
cout << "unsigned 0-1 = " << u << endl;
// Практика: безопасная проверка на переполнение
int a = 2000000000, b = 2000000000;
// if (a + b < 0) → ОШИБКА: сначала переполнение, потом проверка
// Правильно:
if ((long long)a + b > INT_MAX) {
cout << "Переполнение! Используйте long long" << endl;
}
return 0;
}
Тип string: работа со строками
#include <iostream>
#include <string>
using namespace std;
int main() {
string name = "Иван Петров";
// Длина
cout << "Длина: " << name.length() << endl; // или name.size()
// Доступ к символам
cout << "Первый: " << name[0] << endl; // И
cout << "Последний: " << name.back() << endl; // в
// Подстрока: substr(начало, длина)
cout << name.substr(5, 6) << endl; // Петров
// Поиск
size_t pos = name.find("Петров");
if (pos != string::npos) {
cout << "Найдено на позиции: " << pos << endl; // 5
}
// Конкатенация
string first = "Иван";
string last = "Петров";
string full = first + " " + last; // через +
full += "!"; // через +=
cout << full << endl; // Иван Петров!
// Сравнение (поддерживает == != < >)
string s1 = "hello", s2 = "hello";
cout << (s1 == s2) << endl; // 1 (true)
cout << (s1 < "world") << endl; // 1 (лексикографически)
// Строка → число
string numStr = "42";
int n = stoi(numStr); // string to int
double d = stod("3.14"); // string to double
// Число → строка
string fromInt = to_string(100); // "100"
string fromDbl = to_string(3.14); // "3.140000"
// Пустая строка
string empty = "";
cout << "Пустая? " << empty.empty() << endl; // 1
// Чтение строки с пробелами
string line;
cin.ignore();
cout << "Введите строку: ";
getline(cin, line); // Читает всю строку
cout << "Вы ввели: " << line << endl;
return 0;
}
Все арифметические операции
#include <iostream>
using namespace std;
int main() {
// Арифметика
int a = 17, b = 5;
cout << a + b << endl; // 22
cout << a - b << endl; // 12
cout << a * b << endl; // 85
cout << a / b << endl; // 3 (целочисленное!)
cout << a % b << endl; // 2 (остаток)
// Дробное деление
cout << (double)a / b << endl; // 3.4
cout << 17.0 / 5 << endl; // 3.4
// Инкремент/декремент
int x = 5;
cout << x++ << endl; // 5 (постфикс: вернуть, потом увеличить)
cout << x << endl; // 6
cout << ++x << endl; // 7 (префикс: сначала увеличить, потом вернуть)
// Составное присваивание
int n = 100;
n += 50; // n = 150
n -= 30; // n = 120
n *= 2; // n = 240
n /= 4; // n = 60
n %= 17; // n = 9
cout << n << endl;
// Математические функции (#include <cmath>)
cout << sqrt(25.0) << endl; // 5
cout << pow(2, 10) << endl; // 1024
cout << abs(-7) << endl; // 7
cout << ceil(2.3) << endl; // 3 (округление вверх)
cout << floor(2.9) << endl; // 2 (округление вниз)
cout << round(2.5) << endl; // 3 (обычное округление)
cout << log(exp(1)) << endl; // 1 (натуральный логарифм)
return 0;
}
Итого: что мы узнали
- ✅ Основные типы:
int,double,char,bool,string - ✅
sizeof(тип)— размер в байтах - ✅ Три стиля инициализации:
=,(),{}(последний предпочтительнее) - ✅
auto— компилятор сам выводит тип (C++11) - ✅
constиconstexpr— константы;constexprвычисляется при компиляции - ✅ Переполнение
int: при выходе за ±2 миллиарда число "оборачивается" - ✅ Для больших чисел —
long long - ✅
stringиз<string>:length(),find(),substr(),+и+= - ✅
stoi(),stod()— строка в число;to_string()— число в строку