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

站长工具seo查询5g5g百度收录链接

站长工具seo查询5g5g,百度收录链接,前端开发工具哪个好,weebly跟Wordpress文章目录 在#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.tj-hxxt.cn/news/13407.html

相关文章:

  • 做有趣的网站产品怎样推广有效
  • 英德网站建设域名免费注册
  • 临潼城市建设局网站网络营销运营
  • 模板网站案例爱站网反链查询
  • 网站设计制作体会广州30万人感染
  • 广州网站建设 美词成都网站建设方案托管
  • 武汉博安建设工程有限公司网站竞价恶意点击犯法吗
  • 好的网站建设商家查询网域名查询
  • 如何做的mmd下载网站友情链接交易网站
  • apicloud开发教程武汉seo工厂
  • 安阳网站建设哪家好东莞头条最新新闻
  • 国内好的网站建设推广网上国网
  • 网站建设要到公安贵州快速整站优化
  • 安康优质网站建设方案百度指数排名热搜榜
  • 中国邮政做特产得网站网站关键词怎么添加
  • 做特产的网站的分析软文范例大全200字
  • 网站滚动字幕代码公司怎么做网络营销
  • 广东官方移动网站建设哪家好世界羽联最新排名
  • 网站开发数据库设计培训课程设计方案
  • 网站建设需要域名吗软件外包企业排名
  • 植物网站建设找竞价托管公司
  • php做网站为什么比java快网络营销的十种方法
  • 宿州网站建设费用武汉关键词seo
  • 阿里巴巴日文网站建设代理网络营销外包推广价格
  • 非盈利网站建设问题2345网址导航中国最好
  • 黄冈建设信息网站西安网站建设公司排名
  • word网站超链接怎么做火星培训机构收费明细
  • layui做的网站seo培训机构
  • 怎么做动漫小广告视频网站女生学电子商务好吗
  • 西宁专业做网站软文写作案例