int x=2; | |
PRINT( x*FIDGE(2) ); | Чтобы понять эффект макроподстановки препроцессора, нужно провести ее в месте вызова |
PR(a); putchar('\n') | Всегда производится самая левая макроподстановка. Сначала вызов заменяется строкой макроподстановки. |
PR(x*FIDGE(2)); putchar('\n') | Затем аргументы заменяются на соответствующие строки |
printf("a = %d\t",(int)(a)) | Опять производится самая левая макроподстановка, на этот раз PR. |
printf("x*FIDGE(2) = %d\t", (int)( x*FIDGE(2))) | Подставляются аргументы макроподстановки. |
printf("x*FIDGE(2) = %d\t", (int)( x* k+3.14159)) | Имя макроподстановки, встречающееся в строке, не заменяется, но аргументы макроподстановки, встречающиеся в строке подстановки, заменяться должны. Значит, a в макроподстановке PR заменяется на x*FIDGE(2), но FIDGE(2), встречающееся при задании формата печати в обращении к printf, не заменяется. |
(int)( x* 2+3.14159) | Заменяя формальный параметр на фактический, получаем неожиданный результат. Сначала умножаем, затем складываем и отбрасываем дробную часть. |