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.

И если вы хотите это исправить:

#define FTIMES(x) ((x) * 5)

Порядок операций.

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. Затем компилятор компилирует код.

Это просто текстовая замена.

Другие вопросы по тегам