

- Главная
- Каталог
- Наука и технологии
- Physics.Math.Code
Physics.Math.Code
📚 Physics.Math.Code — библиотека с технической литературой для физиков, математиков, инженеров и разработчиков:
● Книги вместе с подробными рецензиями
● Видеоуроки по физике, математике и программированию
● Обсуждения и разборы интересных задач
● Большой чат технарей, в котором вы можете получить консультации и помощь по вашей задаче
Статистика канала
Полная статистикаchevron_right
#include <iostream>
#define MERGE(a, b) a ## b
int main() {
const char* result1 = MERGE("Hello, ", "World!");
const char* result2 = MERGE("Hello, ", "World" "!");
std::cout << result1 << std::endl;
std::cout << result2 << std::endl;
return 0;
}{}
Варианты:
1. Обе строки выведут "Hello, World!"
2. Ошибка компиляции
3. Первая выведет мусор, вторая — "Hello, World!"
4. Первая вызовет ошибку, вторая скомпилируется
Задумайтесь на минутку, прежде чем запускать код...
🔍 Разбор проблемы
Правильный ответ: 2 (Ошибка компиляции) или, если точнее, ошибка возникнет уже на строке с result1.
#include <iostream> #define MERGE(a, b) a ## b int main() { // Эта строка НЕ скомпилируется: // const char* result1 = MERGE("Hello, ", "World!"); // После раскрытия макроса получим: "Hello, ""World!" // Это два отдельных строковых литерала без оператора конкатенации // А вот эта строка скомпилируется и выведет "Hello, World!": const char* result2 = MERGE("Hello, ", "World" "!"); // После раскрытия макроса получим: "Hello, ""World""!" // А благодаря фазе трансляции, соседние строковые литералы // сливаются в один: "Hello, World!!" // Правильный способ через макрос: const char* result3 = "Hello, " "World!"; std::cout << result2 << std::endl; // Выведет: Hello, World!! std::cout << result3 << std::endl; // Выведет: Hello, World! return 0; }📚 Малоизвестный факт: В C++ есть специальная фаза трансляции, где соседние строковые литералы объединяются в один. Например:
const char* s = "Hello, " "World!"; // Эквивалентно "Hello, World!"
Но этот процесс происходит до раскрытия макросов, поэтому MERGE("Hello, ", "World!") не работает как ожидается.
Ключевые моменты:
1. Оператор ## в макросах выполняет сращивание токенов, а не строк
2. Строковые литералы автоматически конкатенируются на фазе трансляции
3. Макросы раскрываются на более поздней фазе, когда уже слишком поздно для "правильной" конкатенации строк
Будьте осторожны с оператором ## при работе со строковыми литералами! Для их конкатенации лучше использовать обычное расположение рядом или constexpr функции в современном C++.
Чем токен отличается от строки?
1. Токен (в контексте препроцессора C++) — это минимальная единица текста программы, которую распознает препроцессор ( int, main, (, ), {, "Hello", 123, +, ; )
Препроцессор работает именно на уровне токенов. Оператор ## сращивает именно токены, а не их значение
2. Строковый литерал — это конкретный тип токена, который представляет строку в кавычках. Пример: "Hello" — это один токен типа "строковый литерал"
Ещё по теме: Задачки по программированию для наших подписчиков [ C/C++ ]
#C #cpp #cplusplus #программирование #задачи
💡 Physics.Math.Code // @physics_libОтзывы канала
Каталог Телеграм-каналов для нативных размещений
Physics.Math.Code — это Telegam канал в категории «Наука и технологии», который предлагает эффективные форматы для размещения рекламных постов в Телеграмме. Количество подписчиков канала в 154K и качественный контент помогают брендам привлекать внимание аудитории и увеличивать охват. Рейтинг канала составляет 7.5, количество отзывов – 0, со средней оценкой 0.0.
Вы можете запустить рекламную кампанию через сервис Telega.in, выбрав удобный формат размещения. Платформа обеспечивает прозрачные условия сотрудничества и предоставляет детальную аналитику. Стоимость размещения составляет 34965.0 ₽, а за 3 выполненных заявок канал зарекомендовал себя как надежный партнер для рекламы в TG. Размещайте интеграции уже сегодня и привлекайте новых клиентов вместе с Telega.in!
Вы снова сможете добавить каналы в корзину из каталога
Комментарий