Вычисление результата макроса и значение переменной

X получит −5: макрос раскрывается в 3-2*3-2, а умножение имеет больший приоритет, чем вычитание. Макрос не вычисляет аргумент до подстановки.

Короткий ответ

Что ответить на собеседовании

X получит −5: макрос раскрывается в 3-2*3-2, а умножение имеет больший приоритет, чем вычитание. Макрос не вычисляет аргумент до подстановки.

Подробный разбор

Ответ с пояснениями

Условие

Нужно определить, какое значение получит переменная X после подстановки макроса.

# define SQ(X) X*X
int X = SQ(3-2);

Ответ

X получит −5: макрос раскрывается в 3-2*3-2, а умножение имеет больший приоритет, чем вычитание. Макрос не вычисляет аргумент до подстановки.

Раскрытие по шагам: SQ(3-2) → 3-2*3-2 → 3-6-2 → -5.

Минимальное исправление — #define SQ(x) ((x) * (x)). Но даже оно вычисляет аргумент дважды, поэтому SQ(i++) остаётся опасным. В C++ предпочтительнее обычная или constexpr-функция, которая получает значение аргумента один раз; для int также нужно учитывать переполнение квадрата.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее