楼主: cindy2468
3569 15

[学习分享] advance 63题39 [推广有奖]

  • 0关注
  • 0粉丝

本科生

0%

还不是VIP/贵宾

-

威望
0
论坛币
98 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
348 点
帖子
48
精华
0
在线时间
62 小时
注册时间
2016-3-16
最后登录
2017-7-12

楼主
cindy2468 发表于 2016-7-1 12:27:31 |AI写论文
50论坛币
The following SAS program is submitted:
%let Mv=shoes;
%macro PRODUCT(Mv=bicycles);
%let Mv=clothes;
%mend;
%PRODUCT(Mv=tents)
%put Mv is &Mv;
What is written to the SAS log?
答案是mv is shoes
为何答案不是mv is clothes?为何mv的值没有被覆盖呢?谢谢

最佳答案

920240553 查看完整内容

相当于在macro程序体内为全局宏变量重新赋值了,而且最终的结果就是赋值后的值,实际上仍然是全局宏变量。参考以下的程序例程: 全局宏变量与局部宏变量的作用域不同。 在macro中未定义参数(也就是没有定义参数内局部宏变量),并且在macro中重新为全局宏变量赋值,其值依然是全局宏变量,且值为重新赋值后的值。 %let Mv=shoes;*全局宏变量; %put Mv1 is &Mv; %macro PRODUCT(Mv=bicycles);*局部宏变量(参数中定义的局 ...
关键词:ADVANCE advan VANCE ance Van following clothes written shoes

回帖推荐

920240553 发表于7楼  查看完整内容

相当于在macro程序体内为全局宏变量重新赋值了,而且最终的结果就是赋值后的值,实际上仍然是全局宏变量。参考以下的程序例程: 全局宏变量与局部宏变量的作用域不同。 在macro中未定义参数(也就是没有定义参数内局部宏变量),并且在macro中重新为全局宏变量赋值,其值依然是全局宏变量,且值为重新赋值后的值。 %let Mv=shoes;*全局宏变量; %put Mv1 is &Mv; %macro PRODUCT(Mv=bicycles);*局部宏变量(参数中定义的局 ...

沙发
920240553 发表于 2016-7-1 12:27:32
cindy2468 发表于 2016-7-5 12:17
谢谢回复!请看下面的例子,为何宏内的let语句生成的变量值可以覆盖全局宏变量的值呢?
%let city=Sydne ...
相当于在macro程序体内为全局宏变量重新赋值了,而且最终的结果就是赋值后的值,实际上仍然是全局宏变量。参考以下的程序例程:
全局宏变量与局部宏变量的作用域不同。
在macro中未定义参数(也就是没有定义参数内局部宏变量),并且在macro中重新为全局宏变量赋值,其值依然是全局宏变量,且值为重新赋值后的值。

%let Mv=shoes;*全局宏变量;
%put Mv1 is &Mv;
%macro PRODUCT(Mv=bicycles);*局部宏变量(参数中定义的局部宏变量);
     %put Mv2 is &Mv;
     %let Mv=clothes;*局部宏变量(macro程序体内定义的宏变量);
     %put Mv3 is &Mv;
%mend;
%product(Mv=tents);
%put Mv4 is &Mv;*全局宏变量;


Mv1 is shoes
Mv2 is tents
Mv3 is clothes
Mv4 is shoes



%let a =cat;*全局宏变量;
%put a1 is &a;
%macro animal;
   %put a2 is &a;
   %let a = dog;*注意:此处实际上仍为全局变量,只是给全局宏变量重新赋值而已,全局变量在宏内赋值,赋值能成功,且该变量依然为全局变量;
   %put a3 is &a;
%mend;
%animal;
%put a4 is &a;*全局变量,打印重新赋值后的值;


a1 is cat
a2 is cat
a3 is dog
a4 is dog

藤椅
孤单的我们 发表于 2016-7-1 12:44:48
%macro外的%let创建的是全局宏变量,%macro内产生的是局部宏变量。

%macro PRODUCT(Mv=bicycles);
%let Mv=clothes;
%mend;
%PRODUCT(Mv=tents)
%put Mv is &Mv;
日志:WARNING: 没有解析符号引用 MV。
Mv is &Mv
%macro PRODUCT(Mv=bicycles);
%let Mv=clothes;
%put Mv is &Mv;
%mend;
%PRODUCT(Mv=tents)
日志:Mv is clothes

板凳
8112mmw 发表于 2016-7-1 20:25:08
首先,“%let Mv=shoes;“建立了一个全局宏变量,变量名为mv,值为shoes。

接着
%macro PRODUCT(Mv=bicycles);
%let Mv=clothes;
%mend;
%PRODUCT(Mv=tents)

建立了一个局部宏变量mv,其值为tents

最后“%put Mv is &Mv;”,解析时,首先从全局宏变量寻找是否有mv(本例中已有),如果没有全局宏变量,然后再从局部宏变量中找是否有mv。

所以解析以后mv是全局宏变量,且mv=shoes

报纸
cindy2468 发表于 2016-7-5 04:39:32
8112mmw 发表于 2016-7-1 20:25
首先,“%let Mv=shoes;“建立了一个全局宏变量,变量名为mv,值为shoes。

接着
那在macro中的%let Mv=clothes为何不是全局宏变量 谢谢您的耐心解答

地板
920240553 发表于 2016-7-5 09:57:00
cindy2468 发表于 2016-7-5 04:39
那在macro中的%let Mv=clothes为何不是全局宏变量 谢谢您的耐心解答
%let Mv=clothes定义在宏的内部,所以是局部宏变量,在宏之外才是全局的。

7
cindy2468 发表于 2016-7-5 12:17:26
920240553 发表于 2016-7-5 09:57
%let Mv=clothes定义在宏的内部,所以是局部宏变量,在宏之外才是全局的。
谢谢回复!请看下面的例子,为何宏内的let语句生成的变量值可以覆盖全局宏变量的值呢?
%let city=Sydney;
%let country=Australia;
%macro look;
data _null_;
%let city=Melbourne;
length longname $20;
longname="&city"||"&Country";
put longname;
run;
%mend;
%look;

8
920240553 发表于 2016-7-5 14:18:20
参考另外一个帖子,也是类似的问题:
https://bbs.pinggu.org/thread-4676857-1-1.html

9
cindy2468 发表于 2016-7-5 21:54:26
920240553 发表于 2016-7-1 12:27
相当于在macro程序体内为全局宏变量重新赋值了,而且最终的结果就是赋值后的值,实际上仍然是全局宏变量。 ...
为何 %let Mv=clothes;不是全局宏变量呢

10
cindy2468 发表于 2016-7-5 22:02:02
920240553 发表于 2016-7-5 09:57
%let Mv=clothes定义在宏的内部,所以是局部宏变量,在宏之外才是全局的。
可是你举的例子  %let a = dog;也是定义在macro内,为何这个是全局宏变量

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-29 18:22