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

礼品册兑换 网站建设搜索排名优化

礼品册兑换 网站建设,搜索排名优化,西藏网站建设全包,网站做实名验证码1 预定义符号 __FILE__ //进行编译的源文件 __LINE__ //文件当前的行号 __DATE__ //文件被编译的日期 __TIME__ //文件被编译的时间 __STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义 这些预定义符号都是…

1 预定义符号

        __FILE__    //进行编译的源文件
        __LINE__   //文件当前的行号
        __DATE__   //文件被编译的日期
        __TIME__   //文件被编译的时间
        __STDC__   //如果编译器遵循ANSI C,其值为1,否则未定义

        这些预定义符号都是语言内置的。

2 #define

        2.1 #define 定义标识符

#define MAX 1000
#define reg register      //为 register这个关键字,创建一个简短的名字
#define do_forever for(;;)   //用更形象的符号来替换一种实现
#define CASE break;case     //在写case语句的时候自动把 break写上。
// 如果定义的 stuff过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续行符)。
#define DEBUG_PRINT printf("file:%s\tline:%d\t \date:%s\ttime:%s\n" ,\__FILE__,__LINE__ ,    \__DATE__,__TIME__ ) 

        注意我们定义宏后面不能加 “ ;”

2.2 #define 定义宏

        #define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义宏(define macro)。

        下面是宏的声明方式:

        #define name( parament-list ) stuff
        其中的 parament-list 是一个由逗号隔开的符号表,它们可能出现在stuff中。

注意:

参数列表的左括号必须与name紧邻。
如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分。

如:

#define SQUARE( x ) x * x

这个宏接收一个参数 x .
如果在上述声明之后,你把

SQUARE( 5 );

置于程序中,预处理器就会用下面这个表达式替换上面的表达式:

5 * 5

        警告:
        这个宏存在一个问题:
        观察下面的代码段:

int a = 5;
printf("%d\n" ,SQUARE( a + 1) );

        乍一看,你可能觉得这段代码将打印36这个值。
        事实上,它将打印11.

        为什么?

        这样就比较清晰了,由替换产生的表达式并没有按照预想的次序进行求值。
        在宏定义上加上两个括号,这个问题便轻松的解决了:

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

        这样预处理之后就产生了预期的效果: 

printf ("%d\n",(a + 1) * (a + 1) );

        这里还有一个宏定义:

#define DOUBLE(x) (x) + (x)

        定义中我们使用了括号,想避免之前的问题,但是这个宏可能会出现新的错误。

int a = 5;
printf("%d\n" ,10 * DOUBLE(a));

        这将打印什么值呢?

        warning:
        看上去,好像打印100,但事实上打印的是55.
        我们发现替换之后:

printf ("%d\n",10 * (5) + (5));

        乘法运算先于宏定义的加法,所以出现了

        55 .

        这个问题,的解决办法是在宏定义表达式两边加上一对括号就可以了。

        #define DOUBLE( x)     ( ( x ) + ( x ) )

提示:
        所以用于对数值表达式进行求值的宏定义都应该用这种方式加上括号,避免在使用宏时由于参数中的操作符或邻近操作符之间不可预料的相互作用。

        2.3 #define 替换规则

        在程序中扩展#define定义符号和宏时,需要涉及几个步骤。
        1. 在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号。如果是,它们首先被替换。
        2. 替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替换。
        3. 最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的符号。如果是,就重复上述处理过程。

注意:
1. 宏参数和#define 定义中可以出现其他#define定义的符号。但是对于宏,不能出现递归。
2. 当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索。

        2.4 #和##

        如何把参数插入到字符串中?

        首先我们看看这样的代码:

char* p = "hello ""bit\n";
printf("hello"" bit\n");
printf("%s", p);

        这里输出的是不是
        hello bit ?
        答案是确定的:是。
        我们发现字符串是有自动连接的特点的。

        1. 那我们是不是可以写这样的代码?:

#define PRINT(FORMAT, VALUE)\
printf("the value is "FORMAT"\n", VALUE);
...
PRINT("%d", 10);

        这里只有当字符串作为宏参数的时候才可以把字符串放在字符串中。
        1. 另外一个技巧是:
        使用 # ,把一个宏参数变成对应的字符串。
        比如:

int i = 10;
#define PRINT(FORMAT, VALUE)\
printf("the value of " #VALUE "is "FORMAT "\n", VALUE);
...
PRINT("%d", i+3);//产生了什么效果?

        代码中的 #VALUE 会预处理器处理为:
        "VALUE" .
        最终的输出的结果应该是:

the value of i+3 is 13

        ## 的作用
##可以把位于它两边的符号合成一个符号。
它允许宏定义从分离的文本片段创建标识符。

#define ADD_TO_SUM(num, value) \
sum##num += value;
...
ADD_TO_SUM(5, 10);//作用是:给sum5增加10.

注:
这样的连接必须产生一个合法的标识符。否则其结果就是未定义的。

 

2.5 带副作用的宏参数

        当宏参数在宏的定义中出现超过一次的时候,如果参数带有副作用,那么你在使用这个宏的时候就可能出现危险,导致不可预测的后果。副作用就是表达式求值的时候出现的永久性效果。

        例如:

        MAX宏可以证明具有副作用的参数所引起的问题。

#define MAX(a, b) ( (a) > (b) ? (a) : (b) )
...
x = 5;
y = 8;
z = MAX(x++, y++);
printf("x=%d y=%d z=%d\n", x, y, z);//输出的结果是什么?

        这里我们得知道预处理器处理之后的结果是什么:

z = ( (x++) > (y++) ? (x++) : (y++));

        所以输出的结果是:

x=6 y=10 z=9
     

http://www.dtcms.com/wzjs/34999.html

相关文章:

  • 网站美工培训机构国外网站如何搭建网页
  • 学校网站建设项目的wbs关键词推广排名软件
  • 用记事本做网站缺少body北京网优化seo优化公司
  • 做网站南宁域名查询网站入口
  • 韩国服装网站建设网络推广专员是做什么的
  • 惠州热门的网站网站建设优化400报价
  • alexa全球网站排名分析品牌推广是做什么的
  • 怎样分析网站做seo在线刷关键词网站排名
  • 进空间的网站吗新网站快速收录
  • 加强政务网站建设谷歌seo服务公司
  • 郑州管城建设网站全球网络营销公司排名
  • 做网站有哪些网址信息查询
  • 中铁快运关于网站建设大数据免费查询平台
  • 做推广最好的网站是哪个?免费的网站域名查询app
  • logo网站有哪些企业查询系统
  • 网站域名和密码武汉网站seo推广公司
  • 医疗网站模板免费下载seo竞价推广
  • 软件网站开发培训聚合搜索引擎入口
  • 公司做网站排名靠前西安seo关键词排名
  • 花都微网站建设网站搜索引擎优化工具
  • 深圳网站官网建设方案百度网址大全
  • 何为门户网站爱站网官网
  • 网站开发的基础是什么seo关键词排名网络公司
  • 郑州网站制作网大二网络营销实训报告
  • 快速做网站的方法电商代运营一般收多少服务费
  • arcengine网站开发拉新十大推广app平台
  • jsp动态网站开发案...临沂百度公司地址
  • 建设银行网站查询信息流广告模板
  • wordpress 优酷免广告插件北京seo的排名优化
  • 电商网站操作手册做app的网站