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

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

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

  运行结果为:input a number:3

  sq=7 同样输入3,但结果却是不一样的。问题在哪里呢? 这是由于代换只作符号代换而不作其它处理而造成的。 宏代换后将得到以下语句: sq=a+1*a+1; 由于a为3故sq的值为7。这显然与题意相违,因此参数两边的括号是不能少的。即使在参数两边加括号还是不够的,请看下面程序:

以下是引用片段:
  #defineSQ(y)(y)*(y)
  main(){
  inta,sq;
  printf("inputanumber:");
  scanf("%d",&a);
  sq=160/SQ(a+1);
  printf("sq=%d
",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。为了得到正确答案应在宏定义中的整个字符串外加括号, 程序修改如下

以下是引用片段:
  #defineSQ(y)((y)*(y))
  main(){
  inta,sq;
  printf("inputanumber:");
  scanf("%d",&a);
  sq=160/SQ(a+1);
  printf("sq=%d
",sq);
  }

  以上讨论说明,对于宏定义不仅应在参数两侧加括号, 也应在整个字符串外加括号。

  5. 带参的宏和带参函数很相似,但有本质上的不同,除上面已谈到的各点外,把同一表达式用函数处理与用宏处理两者的结果有可能是不同的。main(){

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

正在加载评论...