Untitled Document

二、简答与编程题：

1、答：在本题中，程序中共定义了三个带参数的宏，且后两个宏定义的替换文本中又包含前面定义过的宏；程序中的输出语句不仅是用宏名表示的，而且还放在了循环语句中。事实上，只要按照宏替换的原则将宏名一步步展开，分析出结果并不困难。下面依次给出语句PRINT2(k,k+12.4);的宏替换结果：
首先将宏PRINT2用对应的"替换文本"替换，并用实参k替换形参a，用实参k+12.4替换形参b，得到
PR(k);PRINT1(k+12.4);
替换后的语句中又出现了两个宏PR和PRINT1。若先将PRINT1展开，以上语句变为：
PR(k);PR(k+12.4);cout<<endl;
最后将PR宏展开，得到：
cout<<k;cout<<k+12.4;cout<<endl;
这时可以清楚的看出：原本一条语句PRINT2(k,k+12.4);经宏替换后变成了三条语句。由于for循环中没有使用复合语句，所以只有第一条语句cout<<k;属于for循环体，后两条语句要等执行完循环体后才执行。
根据for语句中的条件可知，循环体将执行3次，k的取值依次为0、50、100，每输出完一项并不换行，而是用一个逗号分隔。退出for循环后，k的值为150。执行语句cout<<k+12.4;时，输出162.4，然后执行语句cout<<endl;实现换行，因此本题的答案应该是：
050100162.4
2、答：本题输出的结果是变量z的值，也就是要求出对CIR(x+y)进行宏替换后表达式的值。按照宏定义应该用替换文本r*r代替宏，并用实参x+y代替形参r，从而替换为：x+y*x+y。再将x=1,y=2代入表达式得到1+2*1+2，计算所得的结果为5，显然变量z的值，也就是本程序输出的结果为5。
通过本题我们应该体会到：宏替换是纯粹的文本串的替换。在定义替换文本时，形参r两侧没有加括号，替换后实参x+y两侧也不能有括号。从而先进行y*x的运算，而不是(1+2)*(1+2)的求(x+y)的平方的运算。因此，在进行宏定义的时候要注意括号的使用。

3、答：输出结果为"011"
4、答：
－1
－1
5、答：赋值语句z=2*(N+Y(5+1));中引用了两个宏名。为了求得z的值，必须分析宏替换后的结果。按照宏替换的原则，首先将带参的宏Y(5+1)展开：用"替换文本"来替换宏，用实参5+1代替宏定义中的形参n(注意区分大小写字母)。从而有语句：
z=2*(3+((3+1)*5+1));
赋值号右侧的表达式计算结果为48，即z的值为48。

6、答：判断是不是字符可以用ASCII码值进行关系比较，并且数字字符'0'-'9'的ASCII是有序排列的，因此判断是不是数字字符可以转化为判断是否在'0'到'9'的区间内。
定义如下：
#define DIGIT(c) (((c)>='0')&&((c)<='9')?1:0