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 также нужно учитывать переполнение квадрата.