и прежде, макроподстановка 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. Макроопределение должно быть простым; если это не удается, используйте функцию.
Содержание раздела