二级C语言考试辅导教程第九章:预处理

豆豆网   技术应用频道   2007年12月08日  【字号: 收藏本文

本文详细介绍二级C语言考试辅导教程第九章:预处理

以下是引用片段:
  inti=1;
  while(i<=5)
  printf("%d
",SQ(i++));
  }
  SQ(inty)
  {
  return((y)*(y));
  }#defineSQ(y)((y)*(y))
  main(){
  inti=1;
  while(i<=5)
  printf("%d
",SQ(i++));
  }

  在上例中函数名为SQ,形参为Y,函数体表达式为((y)*(y))。在例9.6中宏名为SQ,形参也为y,字符串表达式为(y)*(y))。 两例是相同的。例9.6的函数调用为SQ(i++),例9.7的宏调用为SQ(i++),实参也是相同的。从输出结果来看,却大不相同。分析如下:在例9.6中,函数调用是把实参i值传给形参y后自增1。 然后输出函数值。因而要循环5次。输出1~5的平方值。而在例9.7中宏调用时,只作代换。SQ(i++)被代换为((i++)*(i++))。在第一次循环时,由于i等于1,其计算过程为:表达式中前一个i初值为1,然后i自增1变为2,因此表达式中第2个i初值为2,两相乘的结果也为2,然后i值再自增1,得3。在第二次循环时,i值已有初值为3,因此表达式中前一个i为3,后一个i为4, 乘积为12,然后i再自增1变为5。进入第三次循环,由于i 值已为5,所以这将是最后一次循环。计算表达式的值为5*6等于30。i值再自增1变为6,不再满足循环条件,停止循环。从以上分析可以看出函数调用和宏调用二者在形式上相似, 在本质上是完全不同的。

  6. 宏定义也可用来定义多个语句,在宏调用时,把这些语句又代换到源程序内。看下面的例子。

以下是引用片段:
  #defineSSSV(s1,s2,s3,v)s1=l*w;s2=l*h;s3=w*h;v=w*l*h;
  main(){
  intl=3,w=4,h=5,sa,sb,sc,vv;
  SSSV(sa,sb,sc,vv);
  printf("sa=%d
sb=%d
sc=%d
vv=%d
",sa,sb,sc,vv);
  }

来源:豆豆网转载    作者:天极网    责编:豆豆技术应用

正在加载评论...