Библиотека собеса по C++ | вопросы с собеседований
Вопросы с собеседований по C++ и ответы на них. Список наших каналов: https://t.me/proglibrary/8353 Учиться у нас: https://proglib.io/w/907158ab Обратная связь: @proglibrary_feedback_bot По рекламе: @proglib_adv Прайс: @proglib_advertising
Mostrar más7 260
Suscriptores
+1024 horas
+357 días
-4230 días
- Suscriptores
- Cobertura postal
- ER - ratio de compromiso
Carga de datos en curso...
Tasa de crecimiento de suscriptores
Carga de datos en curso...
🍔 Отладочные макросы
Отладочные макросы в C++ используются для упрощения процесса отладки и диагностики программного кода
Основные отладочные макросы включают assert, static_assert и пользовательские макросы
🍓 assert
Макрос assert определён в заголовочном файле <cassert> и используется для проверки логических выражений во время выполнения программы. Если выражение вернёт false, assert завершает выполнение программы и выводит сообщение об ошибке
#include <cassert>
void test(int x) {
assert(x > 0 && "x must be positive");
// остальной код функции
}
int main() {
test(5); // проходит проверку
test(-3); // приводит к ошибке во время выполнения
return 0;
}
🍒 static_assert
static_assert введён в C++11 и позволяет проверять условия на этапе компиляции. Это особенно полезно для проверки условий, которые должны выполняться всегда, независимо от состояния программы во время выполнения
#include <type_traits>
template <typename T>
void check() {
static_assert(std::is_integral<T>::value, "T must be an integral type");
}
int main() {
check<int>(); // проходит проверку
check<float>(); // ошибка компиляции: T must be an integral type
return 0;
}
🫐 Пользовательские отладочные макросы
Вы также можете определять собственные макросы для отладки, которые помогут вам выводить дополнительную информацию или выполнять специфические проверки
#include <iostream>
#define DEBUG
#ifdef DEBUG
#define DEBUG_PRINT(x) std::cout << x << std::endl
#else
#define DEBUG_PRINT(x)
#endif
int main() {
int value = 42;
DEBUG_PRINT("Value: " << value);
return 0;
}
👍 3🔥 1
⚡️Proglib запускает канал про ИИ для генерации звука
Там мы будем рассказывать про все существующие нейросети, которые генерируют музыку и голос — с пошаговыми инструкциями, инструментами и лайфхаками.
⭐️генерация голоса и музыки
⭐️замена и перевод речи
⭐️распознавание звуков
👉Подписывайтесь!
Что из следующего верно о шаблонах?Anonymous voting
- 1. Шаблон — это функция C ++, которая позволяет нам писать один код для разных типов данных
- 2. Мы можем написать одну функцию, которая может использоваться для всех типов данных
- 3. Мы можем написать один класс или структуру, которая может использоваться для всех типов данных
- 4. Шаблон — это пример полиморфизма во время компиляции
- 1 и 2
- 1, 2 и 3
- 1, 2 и 4
- 1, 2, 3 и 4
🤔 7
🍔 Какая избавиться от вложенных min/max?
Старый вариант использования
auto maxVal = std::max(x1, min(x2, min(x3, x4)));
Сейчас же можно использовать cписки инициализации, чтобы уменьшить вложенность
auto maxVal = std::max(({x1, x2, x3, x4});
👍 6
😱 В чем разница между вектором и списком?
std::vector — это реальный массив, а базовая реализация std::list — это двусторонне связанный список
❗ std::vector поддерживает произвольный доступ с доступом за O(1), но производительность вставки и удаления в общем случае низкая. Но стоить отметить что вставка в конец если capacity больше size происходить за O(1)
❗Так же вставка и удаление из std::vector в узлах, отличных от хвоста, вызовет копирование памяти, в std::list такого не происходит
❗std::list не поддерживает произвольный доступ, но производительность вставки и удаления O(1)
❗std::vector хранится последовательно, список — нет
❗std::vector выделяет память сразу и увеличивает емкость в два раза, когда ее недостаточно. std::list будет обращаться за новой памятью каждый раз, когда вставляется новый узел
👍 4
😱 Как объединить строки в C?
В Си строки - это просто массивы char'ов. Следовательно, мы не можем напрямую объединить их с другими строками
Мы можем использовать strcat функцию, которая добавляет строку, на которую указывает src, в конец строки, на которую указывает dest:
char *strcat(char *dest, const char *src);
❗️dest выполняет роль буфера назначения. Буфер назначения должен быть буфером массива символов. Он должен быть больше суммарного размера двух строк: той которая в нём уже есть и той которая копируется
Пример:
char str[80];
strcpy(str, "these ");
strcat(str, "strings ");
strcat(str, "are ");
strcat(str, "concatenated.");
❗️Возвращаемое значение strcat можно просто игнорировать, оно просто возвращает тот же указатель, который был передан в качестве первого аргумента
strcat(strcat(str, foo), bar);
Из всего выше сказанного объединить две строки можно с помощью
char *foo = "foo";
char *bar = "bar";
char str[80];
strcpy(str, "TEXT ");
strcat(str, foo);
strcat(str, bar);
👍 2
Photo unavailableShow in Telegram
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
🔮 Что вернёт a[10] == 10 [a]?
Стандарт Си определяет [] как оператор следующим образом:
a[b] == *(a + b)Следовательно , a[5] будет вычисляться как:
*(a + 10)а 10[a] будет вычисляться как
*(10 + a)a - указатель на первый элемент массива. a[10] - это значение, которое на 10 элементов дальше от a, что совпадает с *(a + 10)
👍 5
🔮 В чем разница между статическим выделением памяти и динамическим выделением памяти?
- Статическое выделение памяти выполняется во время компиляции и не потребляет ресурсов ЦП; динамическое выделение памяти выполняется во время выполнения, а для выделения и освобождения требуются ресурсы ЦП
- Динамическое выделение памяти может привести к утечке памяти
- Для выделения статической памяти не требуется поддержка указателей. Для динамического выделения памяти требуется
- Статическое выделение памяти выполняется по плану, и размер блока памяти определяется перед компиляцией. Динамическое выделение памяти выполняется по мере необходимости
- Статическое выделение памяти дает контроль над памятью компилятору. Динамическое выделение памяти дает контроль над памятью программисту
👍 8🤔 1
🌳 Разница между кучей и стеком
• Стек непрерывен, но куча не обязательно непрерывна
• Существуют разные способы применения.Стек автоматически выделяется операционной системой, а кучей приходится управлять вручную
• Стек растет от большего адреса к меньшему, куча растет от меньшего адреса к большему
• Временем жизни стека управляет система и в большинстве случаев доступ к нему более быстрый. Куча же может распределяться неравномерно по памяти и подвержена внутренней фрагментации
👍 6