C #define макросы
Вот что у меня есть, и мне интересно, как это работает и что на самом деле делает.
#define NUM 5
#define FTIMES(x)(x*5)
int main(void) {
int j = 1;
printf("%d %d\n", FTIMES(j+5), FTIMES((j+5)));
}
Выдает два целых числа: 26 и 30.
Как оно это делает?
7 ответов
Это происходит потому, что ваш макрос расширяет печать до:
printf("%d %d\n", j+5*5, (j+5)*5);
Имея в виду:
1+5*5 and (1+5)*5
Поскольку это еще не было упомянуто, способ решить эту проблему заключается в следующем:
#define FTIMES(x) ((x)*5)
Скобки вокруг x
в расширении макроса предотвращается проблема ассоциативности операторов.
define - это просто подстановка строк.
Ответ на ваш вопрос после этого - порядок действий:
FTIMES (j + 5) = 1 + 5 * 5 = 26
FTIMES ((j + 5)) = (1 + 5) * 5 = 30
Предварительный процесс компилятора просто заменяет FTIMES там, где он его видит, а затем компилирует код. В действительности код, который видит компилятор, выглядит так:
#define NUM 5
#define FTIMES(x)(x*5)
int main(void)
{
int j = 1;
printf("%d %d\n", j+5*5,(j+5)*5);
}
Затем, принимая во внимание предпочтения оператора, вы можете понять, почему вы получаете 26 и 30.
Порядок операций.
FTIMES (j + 5) где j=1 оценивается как:
1 + 5 * 5
Который:
25 + 1
= 26
Делая FTIMES((j+5)), вы изменили его на:
(1 + 5) * 5
6 * 5
30
Препроцессор заменяет все вхождения NUM в коде на 5, а все FTIMES(x) на x * 5. Затем компилятор компилирует код.
Это просто текстовая замена.