SAS公司专门出这些花哨又不适用的题目来忽悠在校的学生,唉,可悲啊。答案的确是a,原因如下:
1)语句%let rc = Begin;将宏变量rc第一次设置成全局宏变量。
2)第二步:if totalobs > 10 then do;
%let rc = high;
end;
else do;
%let rc = low;
x=3;
end;
这步它设置了一个陷阱,一定要注意其中的if else语句是data步的条件语句,所以此时的rc宏变量其实应该是全局宏变量。也就是会说,不管你把这两个rc语句放在什么地方,只要在包含data步内部,那么它就一定是全部宏变量,原因请参考宏变量的help资料。所以,如果你把上面的判断语句改成如下:
%if totalobs > 10 %then %do;
%let rc = high;
%end;
%else %do;
%let rc = low;
%end;;
那么结果就是high.原因就是这时候的%if语句已经变成宏的判断语句,显然,%if totalobs > 10 条件为真,故执行%let rc = high;而不会执行$else后面的%let rc = low;
3)第三步:%let rc = Before Execution;这个很简单,因为此时已经跳出data步,但是又在Macro内部,故它又是一个局部变量,局部宏变量只要宏退出,它就从内存退出。
综上,你看到的rc其实包含在不同的符号表里面,如下:
%let rc = Begin;包含在全局宏变量符号表;
%let rc = high;包含在全局宏变量符号表;并覆盖%let rc = Begin;
%let rc = low;包含在全局宏变量符号表;并覆盖%let rc = high;
%let rc = Before Execution;包含在局部宏变量符号表;与上面的全局宏变量不在同一个符号表里面,两者占用不同的内存空间。且%let rc = Before Execution会随着宏程序执行完毕而推出内存,所以最后你看到的当然是全局宏变量的那个值Low了。
明白了没有?