当前位置: 首页 > 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.hengruixuexiao.com/news/8804.html

相关文章:

  • 响应式表白网站源码万能导航网
  • 公司创建一个网站需要多少钱aso优化方案
  • 外贸电子商务网站建设今天的新闻头条
  • 武汉网站建设ahuaseo好的推广方式
  • 软件技术升本可以升什么专业网站排名优化师
  • 佛山移动网站建设公司河南百度推广代理商
  • 为什么做这个网站项目北京seo网站开发
  • 网站建设盈利模式漯河网络推广哪家好
  • html5响应式网站开发教程营销型网站策划
  • 城阳网站建设培训网站内容优化怎么去优化呢
  • 网站制作计划书合肥网络公司seo建站
  • 网站建设优化项目搜索引擎优化的报告
  • 苏州h5网站建设百度网首页登录入口
  • 佛山网站建设找方维网络搜索引擎的网址有哪些
  • 黄页88推广多少钱重庆seo网站推广费用
  • 网站banner制作怎么开网站
  • 腾讯微信网站建设价格电子商务网站建设与维护
  • 免费的wordpress模板下载地址seo搜索优化专员招聘
  • 梓潼县住房和城乡建设局网站网站怎么才能被百度收录
  • 做相册哪个网站好今日小说搜索百度风云榜
  • 网站音频播放器源码天津百度seo推广
  • 企业网站建设验收产品市场调研怎么做
  • 郑州做网站 码通网页制作的软件有哪些
  • 网站空间是怎么开通的小广告怎么能弄干净
  • 日本做家纺的公司网站杭州seook优屏网络
  • 嘉兴做网站多少钱推广互联网推广
  • wordpress 导航函数seo营销推广公司
  • 个人备案的域名拿来做别的网站找关键词的三种方法
  • 湖北建设部网站中国有几个搜索引擎
  • 网站开发合同文档平台交易网