This media is not supported in your browser
VIEW IN TELEGRAM
На этом сайте собраны учебники и статьи по Python, JavaScript, Java, C/C++ и даже по искусственному интеллекту. Если хочешь учиться результативно, разобраться с языком или модулем — можно открыть нужную тему и идти шаг за шагом.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍9❤4😁3
Ограничиваем значения аккуратно — std::clamp!
Во многих местах нужно держать значение в пределах: проценты 0–100, яркость 0–255, уровень громкости и т.п. Часто это пишут руками через
Сначала классический “ручной” вариант, который встречается в каждом втором проекте:
Теперь тот же самый смысл через
Код становится короче и выразительнее: сразу видно, что это именно ограничение диапазона, а не какая-то сложная логика.
🔥 Используй
📣 C++ Ready | #практика
Во многих местах нужно держать значение в пределах: проценты 0–100, яркость 0–255, уровень громкости и т.п. Часто это пишут руками через
if, но в C++17+ есть готовая функция std::clamp.Сначала классический “ручной” вариант, который встречается в каждом втором проекте:
int normalize_volume(int value) {
if (value < 0) value = 0;
if (value > 100) value = 100;
return value;
}Теперь тот же самый смысл через
std::clamp — читается как «ограничить value диапазоном [0, 100]»:int normalize_volume(int value) {
return std::clamp(value, 0, 100);
}std::clamp работает и с другими типами — например, можно ограничить координату по ширине окна:int clamp_x(int x, int window_width) {
return std::clamp(x, 0, window_width - 1);
}Код становится короче и выразительнее: сразу видно, что это именно ограничение диапазона, а не какая-то сложная логика.
std::clamp везде, где значения не должны “вываливаться” из диапазона — меньше кода, меньше шансов ошибиться в условиях.Please open Telegram to view this post
VIEW IN TELEGRAM
❤23🔥12👍9🤝2
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥14❤7🤝6😁1
Проверяем предположения с помощью assert!
Сейчас научимся использовать
Подключим нужную библиотеку — она уже есть в стандартной поставке:
Вставляем проверку, которая должна быть всегда верной при корректной работе программы:
Если условие внутри assert() ложно, программа остановится и покажет точку сбоя. Это помогает сразу увидеть, где нарушено предположение.
Пример с указателем:
Возможный результат при запуске (если условие нарушено):
🔥 Таким образом ты можешь на лету проверять важные условия по типу диапазонов или нулевых указателей.
📣 C++ Ready | #практика
Сейчас научимся использовать
assert() для быстрого выявления ошибок во время выполнения программы. Это пригодится при отладке и проверке логики.Подключим нужную библиотеку — она уже есть в стандартной поставке:
#include <cassert>
Вставляем проверку, которая должна быть всегда верной при корректной работе программы:
int x = getValue();
assert(x >= 0); // программа завершится, если x < 0
Если условие внутри assert() ложно, программа остановится и покажет точку сбоя. Это помогает сразу увидеть, где нарушено предположение.
Пример с указателем:
int* ptr = getPointer();
assert(ptr != nullptr); // защита от разыменования нулевого указателя
Возможный результат при запуске (если условие нарушено):
Assertion failed: ptr != nullptr, file main.cpp, line 6
🔥 Таким образом ты можешь на лету проверять важные условия по типу диапазонов или нулевых указателей.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥10❤6🤝2
В этой статье:
• Ироничные «вредные советы» по C++ из реальных проектов• Разбор, почему советы опасны, с наглядными примерами ошибок• Краткие выводы, как переписать код безопаснее и понятнее🔊 Продолжай читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11🔥7👍4
Как не копировать лишнее в циклах?
В варианте
Чаще всего достаточно ссылки на уже существующий объект:
Когда объект нужно именно «забрать», делаем это явно:
🔥 Итог: перебирай контейнеры через
📣 C++ Ready | #совет
В варианте
for (auto user : users) каждый элемент вектора копируется. Если структура тяжёлая — это лишние аллокации и падение производительности.Чаще всего достаточно ссылки на уже существующий объект:
for (const auto& user : users) { ... } // без копий, только чтениеauto& — ссылка без копии, const auto& — ссылка только для чтения.Когда объект нужно именно «забрать», делаем это явно:
for (auto& user : users) {
process(std::move(user));
}auto& / const auto&, а перенос делай явным std::move — меньше скрытых копий и понятнее код. Please open Telegram to view this post
VIEW IN TELEGRAM
❤16👍12🔥7
Убираем ворнинги красиво — атрибут [[maybe_unused]]
Часто в коде появляются переменные или параметры, которые нужны только в отладке или “на будущее”.
Компилятор тут же ругается:
С атрибутом
Например, параметр, который нужен только в отладочной сборке:
Точно так же можно помечать локальные переменные, которые используются только в
Атрибут можно навесить и на всю функцию, если она может пока ниоткуда не вызываться:
🔥
📣 C++ Ready | #практика
Часто в коде появляются переменные или параметры, которые нужны только в отладке или “на будущее”.
Компилятор тут же ругается:
unused variable / unused parameter. Удалять их не всегда удобно, а вот пометить — можно.С атрибутом
[[maybe_unused]] ты прямо говоришь компилятору: «эта штука может не использоваться — это ок».Например, параметр, который нужен только в отладочной сборке:
void handle_request(int id, int debug_code [[maybe_unused]]) {
#ifdef DEBUG
// В отладке логируем больше деталей
log_debug("debug_code = " + std::to_string(debug_code));
#endif
// основная логика обработки запроса
process(id);
}Точно так же можно помечать локальные переменные, которые используются только в
assert или временно отключены:void foo() {
int value [[maybe_unused]] = compute_something();
// допустим, пока проверка отключена
// assert(value > 0);
do_work();
}Атрибут можно навесить и на всю функцию, если она может пока ниоткуда не вызываться:
[[maybe_unused]]
void debug_dump_state() {
// вспомогательная отладочная функция
}
[[maybe_unused]] помогает держать код аккуратным: ты явно показываешь намерение и убираешь лишние ворнинги без костылей и странных #ifdef вокруг каждой строки.Please open Telegram to view this post
VIEW IN TELEGRAM
❤16🔥13👍4👎1
На картинке — цветная таблица со всеми основными статусами: от успешных 2xx до фатальных 5xx, чтобы быстро вспомнить, что скрывается за 404, 418 или 500, не шарясь по документации.
Сохрани, чтобы всегда под рукой был словарь ответов любого веб-сервиса!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11🤝9❤4👍2😁1
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥26🤝16👍5❤2😁2
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14❤12👍6
В этой статье:
• Понять, зачем нужны умные указатели и автоматическое управление памятью• Разобраться в различиях unique_ptr, shared_ptr и weak_ptr на примерах• Научиться выбирать подходящий умный указатель и избегать типичных ошибок🔊 Продолжай читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍9❤4