当前位置: 首页 > news >正文

学校网站管理方案旅行社手机网站建设成

学校网站管理方案,旅行社手机网站建设成,黄浦网站设计,做网站公司宁波文章目录 在#define中使用参数参考资料 在#define中使用参数 在#define中使用参数可以创建外形和作用与函数类似的类函数宏。带有 参数的宏看上去很像函数,因为这样的宏也使用圆括号。类函数宏定义的圆 括号中可以有一个或多个参数,随后这些参数出现在替…

文章目录

  • 在#define中使用参数
  • 参考资料

在#define中使用参数

在#define中使用参数可以创建外形和作用与函数类似的类函数宏。带有
参数的宏看上去很像函数,因为这样的宏也使用圆括号。类函数宏定义的圆
括号中可以有一个或多个参数,随后这些参数出现在替换体中,如图所
示。
在这里插入图片描述

下面是一个类函数宏的示例:

#define SQUARE(X) X*X

在程序中可以这样用:

z = SQUARE(2);

这看上去像函数调用,但是它的行为和函数调用完全不同。程序示了类函数宏和另一个宏的用法。该示例中有一些陷阱,请仔细阅读。

/* mac_arg.c -- 带参数的宏 */
#include <stdio.h>
#define SQUARE(X) X*X
#define PR(X) printf("The result is %d.\n", X)
int main(void)
{
int x = 5;
int z;
printf("x = %d\n", x);
z = SQUARE(x);
printf("Evaluating SQUARE(x): ");
PR(z);
z = SQUARE(2);
printf("Evaluating SQUARE(2): ");
PR(z);
printf("Evaluating SQUARE(x+2): ");
PR(SQUARE(x + 2));
printf("Evaluating 100/SQUARE(2): ");
PR(100 / SQUARE(2));
printf("x is %d.\n", x);
printf("Evaluating SQUARE(++x): ");
PR(SQUARE(++x));
printf("After incrementing, x is %x.\n", x);
return 0;
}

这里,SQUARE 是宏标识符,SQUARE(X)中的 X 是宏参数,X * X 是替
换列表。程序清单 16.2 中出现SQUARE(X)的地方都会被X * X替换。这与前
面的示例不同,使用该宏时,既可以用X,也可以用其他符号。宏定义中的
X由宏调用中的符号代替。因此,SQUARE(2)替换为2 * 2,X实际上起到参数
的作用。
然而,稍后你将看到,宏参数与函数参数不完全相同。下面是程序的输
出。注意有些内容可能与我们的预期不符。实际上,你的编译器输出甚至与
下面的结果完全不同。

x = 5
Evaluating SQUARE(x): The result is 25.
Evaluating SQUARE(2): The result is 4.
Evaluating SQUARE(x+2): The result is 17.
Evaluating 100/SQUARE(2): The result is 100.
x is 5.
Evaluating SQUARE(++x): The result is 42.
After incrementing, x is 7.

前两行与预期相符,但是接下来的结果有点奇怪。程序中设置x的值为
5,你可能认为SQUARE(x+2)应该是 7 * 7,即 49。

但是,输出的结果是 17,这不是一个平方值!导致这样结果的原因是,我们前面提到过,预处理器不做计算、不求值,只替换字符序列。预处理器把出现x的地方都替换成x+2。因此,x * x变成了x+2*x+2。如果x为5,那么该表达式的值为:

5+2*5+2 = 5 + 10 + 2 = 17

该例演示了函数调用和宏调用的重要区别。函数调用在程序运行时把参
数的值传递给函数。宏调用在编译之前把参数记号传递给程序。这两个不同
的过程发生在不同时期。是否可以修改宏定义让SQUARE(x+2)得36?
当然可以,要多加几个圆括号:

#define SQUARE(x) (x)*(x)

现在SQUARE(x+2)变成了(x+2)*(x+2),在替换字符串中使用圆括号就得
到符合预期的乘法运算。

但是,这并未解决所有的问题。下面的输出行:

100/SQUARE(2)

将变成:

100/2*2

根据优先级规则,从左往右对表达式求值:
(100/2)2,即502,得100。把SQUARE(x)定义为下面的形式可以解决这种混乱:

#define SQUARE(x) (x*x)

这样修改定义后得100/(2*2),即100/4,得25。
要处理前面的两种情况,要这样定义:

#define SQUARE(x) ((x)*(x))

因此,必要时要使用足够多的圆括号来确保运算和结合的正确顺序。

尽管如此,这样做还是无法避免程序中最后一种情况的问题。
SQUARE(++x)变成了++x*++x,递增了两次x,一次在乘法运算之前,一次
在乘法运算之后:

++x*++x = 6*7 = 42

由于标准并未对这类运算规定顺序,所以有些编译器得 76。而有些编
译器可能在乘法运算之前已经递增了x,所以7
7得49。在C标准中,对该表
达式求值的这种情况称为未定义行为。无论哪种情况,x的开始值都是5,虽
然从代码上看只递增了一次,但是x的最终值是7。
解决这个问题最简单的方法是,避免用++x 作为宏参数。一般而言,不
要在宏中使用递增或递减运算符。但是,++x可作为函数参数,因为编译器
会对++x求值得5后,再把5传递给函数。

参考资料

《C Primer Plus》

http://www.yayakq.cn/news/85964/

相关文章:

  • 建立网站要什么条件和多少钱邮政营销案例100例
  • 网站建设考虑哪些因素企业邮箱申请理由
  • 郑州建设网站费用wordpress怎么挂广告
  • 湖南网站建设开发公司泾川门户网
  • 桥的设计网站建设西安网络科技公司有哪些
  • 相亲网站开发与设计报告招聘网站怎么做才能吸引人
  • 南昌企业做网站设计玛丽与魔女之花网页设计教程
  • 做360手机网站快速唐山网站建设价格
  • 网站代码框架龙岗网
  • 北京哪家做网站网站做301重定向怎么做
  • ae成品免费下载网站学做网站在什么地方学
  • 学网站建设多少学费wordpress qvanxian
  • 网站服务器查询工具西安印象网站建设
  • 网站模版整站下载xampp wordpress 建站教程
  • 做网站需要下什么软件优秀手机网站案例
  • 水资源论证网站建设做外贸的网站平台有哪些内容
  • wordpress网站结构企业网站如何去做优化
  • 抚州制作网站哪家公司好做h5网站制作
  • 杭州旅游网站开发说明书佛山网站建设wantsun
  • 深圳市建设交易中心网站贵州建设厅网站报名系统
  • 温州住房与城乡建设部网站中国建筑网官网登录
  • 网站建设faqwordpress 标签小工具
  • 网站建设126wordpress权限控制
  • 南昌专业的网站建设公司做推广一般那些网站比较好
  • 黑龙江省建设协会网站首页免费的自助建站
  • wordpress缓存设置乌兰察布seo
  • 深圳微信网站建设公司wordpress新建php页面
  • 网站建设与管理的过程百度权重工具
  • 外贸网站的推广方法电子商务网页制作试题及答案
  • 花都移动网站建设从信息化建设办公室网站