Как работает арифметика переопределенных символов? - PullRequest
3 голосов
/ 26 сентября 2019

C ++ позволяет программистам переопределять символы в порядке

#define A 0

, но поведение этих переопределенных символов при использовании в контексте друг друга и с арифметикой необычно из-за того, что эти значенияобрабатываются как строки, а не как литералы.

Я запутался в логике, которую использует эта арифметика, и надеялся получить объяснение того, как она работает.Я провел несколько тестов, пытаясь понять, как это работает, используя разные значения, но это все еще сбивает меня с толку.

пример 1:

#define A 0
#define B A+1
#define C 1-B

cout << C;

пример 2:

#define ALPHA 2-1
#define BETA ALPHA * 2

cout << BETA;

пример 1: ожидаемый результат равен 0, фактический результат равен 2 пример 2: ожидаемый результат равен 2, фактический результат равен 0

Кто-нибудь может объяснить, как именно это работает?

Ответы [ 3 ]

3 голосов
/ 26 сентября 2019

Макросы заменяют текст.Следующие строки показывают, как текст заменяется на шаговый шаг препроцессора:

cout << C;
cout << 1-B;
cout << 1-A+1;
cout << 1-0+1;

cout << BETA;
cout << ALPHA * 2;
cout << 2-1 * 2;
2 голосов
/ 26 сентября 2019

Эти макросы просто заменяются встроенными теми, кем вы их определилиТаким образом:

#define A 0
#define B A+1
#define C 1-B

cout << C;

становится:

cout << 1-0+1;

и

#define ALPHA 2-1
#define BETA ALPHA * 2

cout << BETA;

становится:

cout << 2-1 * 2;
1 голос
/ 26 сентября 2019

Макрос препроцессора #define поддерживает текстовое замещение .Два ваших примера сведены к одной строке кода на C ++ каждый:

cout << 1-0-1;

и

cout << 2-1 * 2;

, и результат, который вы получаете, соответствует вашим ожиданиям (помните, чтоc ++ ставит приоритет * выше, чем + и оценивает одинаковые строки приоритета слева направо.).

...