友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
小说一起看 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

C语言设计-第28章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!



    max=(x》y)?x:y;
用于计算 x;y 中的大数。
对于带参的宏定义有以下问题需要说明:
1。 带参宏定义中,宏名和形参表之间不能有空格出现。
   例如把:
       #define MAX(a;b) (a》b)?a:b
写为:
    #define MAX  (a;b)  (a》b)?a:b
将被认为是无参宏定义,宏名 MAX 代表字符串 (a;b) (a》b)?a:b。宏展开时,宏调用语
句:
    max=MAX(x;y);
将变为:
    max=(a;b)(a》b)?a:b(x;y);
这显然是错误的。
2。 在带参宏定义中,形式参数不分配内存单元,因此不必作类型定义。而宏调用中的实参有
具体的值。要用它们去代换形参,因此必须作类型说明。这是与函数中的情况不同的。在函
数中,形参和实参是两个不同的量,各有自己的作用域,调用时要把实参值赋予形参,进行
“值传递”。而在带参宏中,只是符号代换,不存在值传递的问题。
3。 在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。
【例 9。5】
#define SQ(y) (y)*(y)
main(){
  int a;sq;
  printf(〃input a number:    〃);
  scanf(〃%d〃;&a);
  sq=SQ(a+1);
  printf(〃sq=%dn〃;sq);


上例中第一行为宏定义,形参为 y。程序第七行宏调用中实参为 a+1,是一个表达式,在
宏展开时,用 a+1 代换 y,再用(y)*(y) 代换 SQ,得到如下语句:
    sq=(a+1)*(a+1);
这与函数的调用是不同的,函数调用时要把实参表达式的值求出来再赋予形参。而宏代
换中对实参表达式不作计算直接地照原样代换。
4。 在宏定义中,字符串内的形参通常要用括号括起来以避免出错。在上例中的宏定义中
(y)*(y)表达式的 y 都用括号括起来,因此结果是正确的。如果去掉括号,把程序改为以下形
式:
【例 9。6】
#define SQ(y) y*y
main(){
  int a;sq;
  printf(〃input a number:    〃);

  scanf(〃%d〃;&a);
  sq=SQ(a+1);
  printf(〃sq=%dn〃;sq);


运行结果为:
input a number:3
sq=7
同样输入 3,但结果却是不一样的。问题在哪里呢? 这是由于代换只作符号代换而不作
其它处理而造成的。宏代换后将得到以下语句:
    sq=a+1*a+1;
由于 a 为 3 故 sq 的值为 7。这显然与题意相违,因此参数两边的括号是不能少的。即使
在参数两边加括号还是不够的,请看下面程序:
【例 9。7】
#define SQ(y) (y)*(y)
main(){
  int a;sq;
  printf(〃input a number:    〃);
  scanf(〃%d〃;&a);
  sq=160/SQ(a+1);
  printf(〃sq=%dn〃;sq);


本程序与前例相比,只把宏调用语句改为:
    sq=160/SQ(a+1);
运行本程序如输入值仍为 3 时,希望结果为 10。但实际运行的结果如下:
input a number:3
sq=160
为什么会得这样的结果呢?分析宏调用语句,在宏代换之后变为:
    sq=160/(a+1)*(a+1);
a 为 3 时,由于“/”和“*”运算符优先级和结合性相同,则先作 160/(3+1)得 40,再作 40*(3+1)
最后得 160。为了得到正确答案应在宏定义中的整个字符串外加括号,程序修改如下:
【例 9。8】
#define SQ(y) ((y)*(y))
main(){
  int a;sq;
  printf(〃input a number:    〃);
  scanf(〃%d〃;&a);
  sq=160/SQ(a+1);
  printf(〃sq=%dn〃;sq);



以上讨论说明,对于宏定义不仅应在参数两侧加括号,也应在整个字符串外加括号。
5。 带参的宏和带参函数很相似,但有本质上的不同,除上面已谈到的各点外,把同一
表达式用函数处理与用宏处理两者的结果有可能是不同的。
【例 9。9】
main(){
  int i=1;
  while(iname=〃Zhang ping〃;
  ps…》sex='M';
  ps…》score=62。5;
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!