Richard_hu2003,
SPR is absolutly correct but the reason that there is a local and global version of &A is more subtle. A slight change in the program will give D as the answer.
[pre]%let a=cat;
%macro animal(b=frog);
%let a=bird;
%mend;
%animal(b=pig)
%put a is &a;
[/pre]
now there is no version of &A on the local table, and cat is replaced by bird.
In your original version of the macro %ANIMAL it is the parameter (A=) that forces a &A to appear on the local table. A %LET inside the macro is not sufficient. I feel that this is an important, albeit fairly subtle, difference in behavior that gets folks into trouble.