⚙️ C++

Conditions (if/else/switch) en C++17 : guide détaillé

Переменные и типы данных 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() — число в строку