a16b2e27

и прежде, макроподстановка PRINT не


int x=1; PRINT( -NEG(x) );
--a Вначале подставляется строка макроподстановки. (Как и прежде, макроподстановка PRINT не производится.)
--x, и x=0 Затем элемент в этой строке заменяется на аргумент обращения.
Строку подстановки образуют точно те символы, которые следуют сразу за закрывающей скобкой списка аргументов. Изюминка данной задачи состоит в том, что -a следует сразу за закрывающей скобкой. Если, следуя правилу 1, определить NEG(a) как (-a), то получим нужный результат. Кроме того, лучше начать строку подстановки с пробела или символа табуляции.





PRINT(weeks(10080));
(days(10080/7)) Заменяем каждое обращение на соответствующую строку. Заметим, что здесь нет никакого конфликта между параметром mins и именем макроподстановки mins.
((hours(10080)/24)/7)
(((10080/60)/24)/7)
1 Вычисляем
PRINT(days(mins(86400)))
(hours(mins(86400))/24) Производим самую левую макроподстановку
((mins(86400)/60)/24)
(((86400/60)/60)/24)
1 Вычисляем


static char input[] = "\twich\tif?";

if( c

TAB включает "открытый" условный оператор. Поэтому после подстановки он "поглощает" оператор, следующий за ближайшим else.

Правило 4. Подстановка макроопределения должна быть законченной конструкцией языка С - выражением, оператором (без последней точки с запятой) или блоком.

В этой задаче трудность устраняется добавлением в определение TAB "пустого" оператора else.

О функциях и макроподстановках. Часто подпрограмму можно реализовать и с помощью функции, и с помощью макроподстановки. Преимущество использования макроподстановки в том, что программа работает быстрее, поскольку нет обращений к функциям. Использование же функции гарантирует, что не возникают всякие неприятные ситуации наподобие тех, которые рассматривались в предыдущих задачах. Кроме того, в случае функций, если они вызываются неоднократно, потребуется, вероятно, меньше памяти. Это приводит нас к заключительному правилу по использованию макроподстановок.

Правило 5. Макроопределение должно быть простым; если это не удается, используйте функцию.


Содержание раздела