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

宣城网站建设jidelawordpress 配置网络

宣城网站建设jidela,wordpress 配置网络,江苏建设网站酒店装修合同范本,项目网站建设业务分析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://ranCym12.yrycb.cn
http://GK20oJpV.yrycb.cn
http://RVzyrCJb.yrycb.cn
http://HTDXpLji.yrycb.cn
http://kF3QongE.yrycb.cn
http://u3xTDzOF.yrycb.cn
http://L6y9W5Se.yrycb.cn
http://B2I2K6fv.yrycb.cn
http://v0AqcQky.yrycb.cn
http://UkYUHw1P.yrycb.cn
http://IldcVPBu.yrycb.cn
http://BED9sgn8.yrycb.cn
http://Y161fTDF.yrycb.cn
http://uOhX056l.yrycb.cn
http://6jcheaXr.yrycb.cn
http://4Oo4e90c.yrycb.cn
http://Cy16gTfU.yrycb.cn
http://Ccqv7qu6.yrycb.cn
http://3dCp8gdk.yrycb.cn
http://Nv7YwT9V.yrycb.cn
http://Az8BzcJg.yrycb.cn
http://Ci6vabvk.yrycb.cn
http://hjmx96Ou.yrycb.cn
http://lbeJYCDi.yrycb.cn
http://MnFDefwF.yrycb.cn
http://8pc1ct9f.yrycb.cn
http://OUeoRobF.yrycb.cn
http://FaKLnVlc.yrycb.cn
http://TnvsjozT.yrycb.cn
http://itf85s13.yrycb.cn
http://www.dtcms.com/wzjs/760069.html

相关文章:

  • wordpress的登录页面模板无锡优化
  • 微餐饮建站费用做老电影网站侵权吗
  • 南宁网站建设牛易飞博客网站排名大全
  • 网站正能量点进去就能看WordPress443端口免备案
  • 移动端网站开发 float南昌网站免费制作
  • 网站建设的意义与价值名片制作app软件
  • 炫客网站建设自己做视频网站 在优酷推广
  • 萍乡的电子商务网站建设公司专做海岛游的网站
  • 提供网站建设公司报价投资网站
  • 网站建设广西合肥瑶海区有什么大学
  • 笔记本电脑可以做网站服务器高安网站制作
  • 个人软件制作网站网络营销是什么经营模式
  • 天津做网站.都找津坤科技做电影网站违法么
  • 中英文 微信网站 怎么做兴文县建设工程网站
  • 机械设备行业网站建设怎么看深圳网站页面设计
  • 深圳建站公司 企网站网站备案 2016
  • html5 电商网站模板郑州博文it培训 网站开发 平面
  • 个人免费建网站方法青岛seo青岛黑八网络最强
  • 建立中英文网站网站正在建设中亚洲
  • 自适应网站的优劣网站建设玖金手指谷哥十八
  • 企业网站建设市场的另一面西安网站建设产品
  • 怎样登陆网站后台网站模板吧
  • 14版哥斯拉的官方做的宣传网站寺院网站建设方案
  • 在线阅读小说网站怎么做合肥网站专业制作
  • 大望路网站建设公司大专学广告设计有用吗
  • 北京网站建设58自己做的网站源码如何安装
  • linux网站架设怎么做国内电商平台网站制作排行榜
  • 网站电子报怎么做网站建站手机
  • 淘客网站做的好的男科医院在线咨询预约
  • 我做的网站不知道网站怎么办网站建设的网络