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

wordpress 进入网站优化建议怎么写

wordpress 进入,网站优化建议怎么写,网站登录页做多大尺寸的,专门做游戏攻略的网站文章目录 前言1. 预定义符号2. #define 定义常量3. #define定义宏4. 带有副作用的宏参数5. 宏替换的规则 前言 在讲解编译和链接的知识点中,我提到过翻译环境中主要由编译和链接两大部分所组成。 其中,编译又包括了预处理、编译和汇编。当时&#xff0c…

文章目录

  • 前言
  • 1. 预定义符号
  • 2. #define 定义常量
  • 3. #define定义宏
  • 4. 带有副作用的宏参数
  • 5. 宏替换的规则

前言

在讲解编译和链接的知识点中,我提到过翻译环境中主要由编译和链接两大部分所组成。
其中,编译又包括了预处理、编译和汇编。当时,我只是粗略的讲解预处理的过程,那么本文将会带着大家去领略预处理的各项操作。还有一些预处理的奇葩操作。

哈哈

1. 预定义符号

C语言设置了一些预定义符号,可以直接使用,预定义符号也是在预处理阶段就被直接替换掉了。

预处理符号:

__FILE__	//意思:进行编译的源文件
__LINE__	//意思:显示该代码语句所在的行数
__DATE__	//意思:文件被编译的日期
__TIME__	//意思:文件被编译的时间
__STDC__	//意思:如果该C编译器完全遵顼ANSI C的标准,则其值为0。否则就是非定义。

演示案例:
预定义符号的演示

2. #define 定义常量

基本语法:

#define name stuff

举个例子:

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

思考一个问题:#define定义标识符时,要不要在最后加上;号?
比如:

#define MAX 1000;
#define MAX 1000

我的建议是不要加;号。你别看上面的代码可以正常的运行,但是针对某些特定的应用场景,可能会引发一些难以察觉的错误。

比如下面的例子:

#define MAX 1000;
int main()
{int max = 0;int condition = 1;if(condition)max = MAX;elsemax = 0;
}

上述代码直接运行会报错,而错误的原因是悬空else的问题。因为MAX本身就拥有了一个;号,而我们在代码写的分号会被是作为一个空语句,也就是说,if之后else之前由两条语句。但是如果要在if后里面写多条语句就得有大括号括起来。否则,就会报语法错误。

3. #define定义宏

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

下面时宏的声明方式:

#define name(parament-list) stuff

其中,parament-list是一个由逗号分隔的符号表,它们可能出现在stuff中。

注意:参数列表的左括号一定要与name紧邻。如果两者之间有空格的话,参数列表就会被编译器解释为stuff中的一部分。

举例:

#define SQUARE(x) x*x

这个宏接受了一个参数x。如果在上述声明过后,把SQUARE(5);置于程序中,与编译器就会用5*5这个表达式来替换SQUARE(5)

但是,我们写的这一个宏有潜在的隐患。为什么这么说呢?
请看下面的例子:

#include<stdio.h>
#define SQUARE(x) x*x
int main()
{int a = 5;printf("%d\n",SQUARE(a + 1));return 0;
}

答案
哎呦,这里的答案不是36吗,为什么这里会打印出11?

其实,这是直接替换文本的弊端,它是直接替换的。也就是说,先前的printf里的参数变为了
printf("%d",a+1*a+1);

这样说的话就比较清晰了,有替换产生的表达式并没有按照我们的预期顺序进行运算求值。

那我们该怎么修改上述的代码,使其能够得到正确的答案呢?
方法很简单,就是加括号,改变运算符的优先级。

#include<stdio.h>
#define SQUARE(x) (x)*(x)
int main()
{int a = 5;printf("%d\n",SQUARE(a + 1));return 0;
}

这样就达到了预期的效果了。

为了巩固大家加括号的意识,我再举一个例子。
这里还有一个宏定义:

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

在定义中我们为了避免预算符之间的优先级和结合性,我们给其添上了括号,但是这个宏仍然会出现问题。

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

这个会打印出什么结果呢?看上去好像是100,但事实上打印的值确是55。

我们发现替换之后:

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

乘法运算的优先级高于加法,所以就会出现55.
为了解决这个问题,我们可以这样写:

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

以上两个例子告诉我们,在写宏时,一定不要节省你的括号。

4. 带有副作用的宏参数

什么叫带有副作用?
请大家看下面几段代码:

int a = 5;
int b = 0; 
b = a + 1; //方案1
b = a++; //方案2

在方案1中,a的值仍然为5 。但在方案2中,a的值就变为6了。相信讲到这里你已经有点感觉了。

所谓带有副作用其实就是以修改参与运算变量的值为代价,实现我们要到达的效果。

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

这里我们设置一段代码来证明带有副作用的宏参数所引发的问题:

#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);//输出的结果是什么?

输出的结果为:x=6,y=10,z=9

5. 宏替换的规则

在程序中扩展使用#define定义符号和宏,需要涉及几个步骤:

  1. 在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号。如果有,它们首先被替换。
  2. 替换后的文本会被插入到程序中原来文本的位置。对于宏来说,参数名被它们的值所替代。
  3. 最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的符号。如果有则重复上述步骤。

注意:

  • 宏参数和#define定义中可以出现其他#define定义的符号。但是对于宏来说,不能出现递归。
  • 当预处理器搜索#define定义的符号的时候,字符串常量的内容不在搜索范围

限于篇幅的原因,本文就像先讲到这里。后续的内容都在预处理详解(下)中,欢迎大家指点一二。💖💖💖

http://www.yidumall.com/news/47586.html

相关文章:

  • wordpress 视频不播放山西seo谷歌关键词优化工具
  • 南川网站建设公司中文网站排行榜
  • 可靠的南京网站建设免费企业网站建设流程
  • 济南网站地址sem推广软件选哪家
  • 学做网站赚钱方法google推广公司
  • 有学做衣服的网站吗百度权重排名查询
  • 可以做视频剪辑兼职的网站深圳白帽优化
  • 系统流小说网站关键词优化推广哪家好
  • 网页设计企业网站素材库b站推广网站2024下载
  • 怎么用vs2015做网站百度快照功能
  • 怎么推广我的网站响应式网站 乐云seo品牌
  • 百科类网站建设爱站网 关键词挖掘工具站长工具
  • 菏泽网站建设公司排名长治网站seo
  • 纯前端网站怎么做rest广告投放价目表
  • 苏州园区网站制作公司百度搜索开放平台
  • 成都网络推广哪家公司好武汉seo系统
  • 子域名ip关键词优化的策略
  • 杭州网站建设ttmwl成都关键词排名系统
  • 赌球网站怎么做自媒体营销模式有哪些
  • 坑梓网站建设如何关键词难易度分析
  • 湖州长兴做网站百度搜索推广多少钱
  • 大淘客网站开发系统优化大师下载
  • 自建服务器做网站要备案抖音十大搜索关键词
  • 自学网网站无锡seo网站管理
  • 来年做哪个网站能致富西安seo顾问公司
  • 开发网站用php还是jsp合肥网络推广培训学校
  • foxmail企业邮箱网页版网站优化团队
  • unity3d做网站什么叫做关键词
  • 网站更新方案烟台seo关键词排名
  • 运营好的网站制作中心网站seo站长工具