Задачи по языку С


         

Препроцессор 1.3


int x=1, y=2;
PRINT3( MAX(x++,y),x,y ); Макроподстановка PRINT3, конечно же, происходит прежде MAX. Однако, дабы не затемнять сути, в этой и последующей задачах подстановка PRINT не будет производиться. Тогда первый шаг состоит в подстановке строки вместо MAX.
(a<b ? b : a), x,y Затем заменяем аргументы макроподстановки на формальные.
(x++<y ? y : x++),x,y Наконец, производим вычисления.
(1<2 ? y : x++), и x=2 (y) 2
PRINT3( MAX(x++,y),x,y ); (x++<y ? y : x++),x,y (2<2 ? y : x++), и x=3 (x++) 3, и x=4 Теперь выполняем второе обращение к PRINT3.

При обращении x++ появляется только один раз, но в расширении фигурирует уже два раза, что приводит к увеличению x иногда на 1, иногда на 2. Тяжесть ответственности за защиту от таких нежелательных побочных эффектов можно возлагать или на того, кто определяет макроподстановку, или на того, кто ею пользуется.

Правило 3. Избегайте макроподстановок, которые могут привести к непредсказуемым или несообразным побочным эффектам.

Правило 3А. В обращениях к макроподстановкам избегайте выражений, содержащих побочные эффекты.

В общем случае проблема побочных эффектов достаточно хитрая. Следование правилу 3 часто означает копирование аргументов в локальные переменные подстановки; эта добавочная работа уменьшает преимущество (в скорости) макроподстановок перед обращением к функциям. Следование же правилу 3А требует знания того, какая подпрограмма реализована как макроподстановка, а какая как функция. В лучшем случае это нарушает представление о подпрограмме как некоей абстракции, а в худшем случае может привести к ошибке, если данная подпрограмма будет реализована по-другому.

В данной задаче следование правилу 3А не затронет саму MAX.




Содержание  Назад  Вперед