打开网易新闻 查看精彩图片

\\\插播一条:

自己在今年整理一套单片机单片机相关论文800余篇

论文制作思维导图

原理图+源代码+开题报告+正文+外文资料

想要的同学私信找我。

C语言的一些误用和知识总结

在进修单片机的时候才真正知道C语言是什么它是来干什么的~但是C语言用到嵌入式只是它小小的一局部他的应用还有很多地方呢,呵呵我们这里就不探讨这个了。我们是不是在写程序的时候错误很多就算编译通过了也达不到我们预期的结果,完了自己是不是也很难找到错在哪儿吧?我绝得语言之所以能称之为语言,它肯定是一种工具一种互相交流互相通信互相传达之间的意图的工具,作为语言那肯定得有自己的语法,要想互相交流肯定得先学好它的语法吧(假如像表达式,函数,循环,指针)我称之为C语言的语法。C语言虽然很强大但是他也有不少陷阱,所以我发这篇博客有两个目标一是:把C语言一些误用易错的地方总结一下,二是把C语言一些根本语法总结一下~

第一次:

1.关于自增自减(即++i,i++)

要想给一个数加一或减一我们能够:

i += 1;

j -= 1;

而C语言还允许用++和--运算符,其实这里有误导,由于++和--能够作为前缀和后缀,这样的话他们就有可能变更操作数的值,下面让我们来看看:

i = 1;

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

【文章福利】:小编整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!~点击绿色通讯软件搜索airuimcu加入。

printf("i is %d\n",++i); /* prints i is 2 */

printf("i is %d\n",i); /* prints i is 2 */

计算表达式i++的结果是i,但是会引发i随后进行自增:

i = 1;

printf("i is %d\n",i++); /* prints i is 1/ */

printf("i is %d\n",i); /* prints i is 2 */

第一个printf 显示了i自增前的原始值,第二个printf显示了i变化后的新值;当然 -- 类似我就不举例了~

但在同一个表达式中屡次运用++和--往往很难了解我们看看下面的例子:

i = 1;

j = 2;

k = ++i + j++;

i,j,k最终值分别是2,3,4而++i是2 j++是2;

总结:不管是++i还是i++执行这条语句后i的值都加一了只是(++i)的值加一了而(i++)没变,

1.typedef与#define

2.1.typedef

C语言除了直接运用规范的类型名(如 int char float double)和自己声明的构造体、共用体、指针、枚举类型外,还能够用typedef声明新的类型名来代替现有的类型名。

typedef unsigned char u8;

typedef unsigned int u16;

u8 count;

u16 time;

typedef struct

u8 month;

u8 day;

u16 year;

}DATE;

DATE brithday;

总结一下,声明新的类型名的方法:

1.先按定义变量的方法写出定义体(如 unsigned int i)

2.在变量名换成新的变量名(如将 i换成u16)

3.在最前面加上typedef (typedef unsigned int u16)

4.其次用新类型名去定义变量

2.2 #define

2.1.1不带参数的宏定义

#define 标识符 字符串

#define PI 3.1415926

注意:

1.它的作用是在本程序中用指定的标识符PI来代替三.1415926

2.宏定义是用宏来代替字符串也就是做简略的置换,不做正确性检查假如写成

#define PI 三.l4l6926

即把1写成了字母l但是预处理照常代入不做任何语法检查!!

2.1.2带参数的宏定义

#define 宏名(参数) 字符串

#define S(a,b) a*b

area = S(a,b);

#define MAX(x,y) (x)>(y) ? (x):(y)

三.typedef和#define的差别

一般来说typedef 由于它能正确处理指针类型

typedef char *String1;

#define String2 char *

String1 s1,s2;

String2 s3,s4;

s1,s2,s3 被定义为了char* 但s4却被定义为了char型

三. static 变量

static变量大致分为三种用法

1. 用于局部变量中,成为静态局部变量. 静态局部变量有两个用法,记忆功能和全局生存期.

2. 用于全局变量,主要作用是限制此全局变量被其他的文件调用.

3. 用于类中的成员.表示这个成员是属于这个类但是不属于类中任意特定对象

1. 静态局部变量

静态局部变量属于静态存储方式,它具有以下特点:

(1)静态局部变量在函数内定义 它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内运用该变量。退出该函数后, 只管该变量还继续存在,但不能运用它。

(2)允许对构造类静态局部量赋初值 例如数组,若未赋以初值,则由系统自动赋以0值。

(3) 对根本类型的静态局部变量若在证明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 依据静态局部变量的特点, 能够看出它是一种生存期为整个源程序的量。虽然离开定义它的函数后不能运用,但如再次调用定义它的函数时,它又可继续运用, 而且保存了前次被调用后留下的值。 因此,当屡次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也能够到达上述目标,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。

举例如下:

void fun()

static int a = 1;

a++;

在第一次进入这个函数的时候,变量a被初始化为1!并接着自增1,以后每次进入该函数,a就不会被再次初始化了,仅进行自增1的操作;在static创造前,要到达同样的功能,则只能运用全局变量:

int a = 1;

void fun()

a++;

2.静态全局变量

全局变量(外部变量)的之前再加上static 就构成了静态的全局变量。全局变量自身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并没不同。这两者的差别虽在于,非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能运用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此能够避免在其它源文件中引起错误。从以上分析能够看出, 把局部变量变更为静态变量后是变更了它的存储方式即变更了它的生存期。把全局变量变更为静态变量后是变更了它的作用域, 限制了它的运用范围。因此static 这个证明符在不同的地方所起的作用是不同的。

3.static的类成员变量

static重要关键字有两种意思,你看高低文来判断

1.表示变量是静态存储变量,表示变量寄存在静态存储区.

2.

表示该变量是内部连接(这种情况是指该变量不在任何{}之内,就象全局变量那样,这时候加上static),也就是说在其它的.cpp文件中,该变量是不可见的(你不能用).

2、static 函数 —— 内部函数和外部函数

当一个源程序由多个源文件组成时,C语言依据函数能否被其它源文件中的函数调用,将函数分为内部函数和外部函数。

1 内部函数(又称静态函数)

假如在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用,这种函数称为内部函数。

定义一个内部函数,只需在函数类型前再加一个“static”重要关键字即可,如下所示:

static 函数类型 函数名(函数参数表)

重要关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。

运用内部函数的益处是:不同的人编写不同的函数时,不用担忧自己定义的函数,是否会与其它文件中的函数同名,由于同名也没相关系。

2 外部函数

外部函数的定义:在定义函数时,假如没有加重要关键字“static”,或冠以重要关键字“extern”,表示此函数是外部函数:

[extern] 函数类型 函数名(函数参数表)

调用外部函数时,须要对其进行证明:

[extern] 函数类型 函数名(参数类型表)[,函数名2(参数类型表2)……];

“入门既不难,深造也是办得到的”,只有你有恒心、有决心,跟随我们的“连载”一步步走下去,将来就一定能在魅力的电子世界里遨游。

更多C语言 C++、JAVA、数电模电、51单片机、PIC stm32 ARM Linux驱动 嵌入式、安卓系统 FPG

想要学习单片机的朋友 ,做毕业设计的同学,关注我们,口令一哥,与导师一起学习成长,共同进步,还有更多资料领取。

说了这么多,大家记得留意下方评论第一条(或者私信我)有干货~

-END-

*本文系网络转载,版权归原作者所有,如有侵权请联系删除