Смущенный квадратичным макросом SQR в c - программирование
Подтвердить что ты не робот

Смущенный квадратичным макросом SQR в c

Этот вопрос был задан мне в издевательском интервью... Очень удивился, найдя неловкие ответы...

рассмотрим макрос:

#define SQR(x) (x*x)

Пример 1:

SQR(2) //prints 4

Пример 2:

Если задана SQR (1 + 1), она не суммирует (1+1) до 2, а скорее...

SQR(1+1) //prints 3

Неудобно? Какова причина? Как работает этот код?

ПРИМЕЧАНИЕ. Я искал SO, но не нашел соответствующих вопросов. Если есть любезно, пожалуйста, поделитесь им!

4b9b3361

Ответ 1

SQR(1+1) расширяется до 1+1*1+1, который равен 3, а не 4, правильно?

Правильное определение макроса было бы

#define SQR(x) ((x)*(x))

который расширяется до (1+1)*(1+1) и более важный, показывает вам одну из причин, по которой вам не следует использовать макросы там, где они не нужны. Лучше следующее:

inline int SQR(int x)
{
    return x*x;
}

Кроме того: SQR(i++) будет undefined поведение, если SQR является макросом и полностью корректно, если SQR является функцией.

Ответ 2

Проблема заключается в том, что макросы выполняют текстовое подмножество перед компиляцией, поэтому макрос расширяется до 1+1*1+1

Ответ 3

Вот почему вы всегда ставите аргументы в макросы в():

#define SQR(x) ((x)*(x))