您的位置 首页 被动

单片机C言语的一些误用和常识

在学习单片机的时候才真正知道C语言是什么它是来干什么的~但是C语言用到嵌入式只是它小小的一部分他的应用还有很多地方呢,呵呵我们这里就不讨论这个了。我们是不是在写程序的时候错误很多就算编译通过了也达

  在学习单片机的时分才真实知道C言语是什么它是来干什么的~可是C言语用到嵌入式仅仅它小小的一部分他的运用还有许多当地呢,呵呵咱们这儿就不评论这个了。咱们是不是在写程序的时分过错许多就算编译通过了也达不到咱们预期的成果,完了自己是不是也很难找到错在哪儿吧?我绝得言语之所以能称之为言语,它必定是一种东西一种彼此沟通彼此通讯彼此传达之间的意图的东西,作为言语那必定得有自己的语法,要想彼此沟通必定得先学好它的语法吧(比如像表达式,函数,循环,指针)我称之为C言语的语法。C言语尽管很强壮可是他也有不少圈套,所以我发这篇帖子有两个意图:一是把C言语一些误用易错的当地总结一下,二是把C言语一些根本语法总结一下。

  第一次:

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

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

  i += 1;

  j -= 1;

  而C言语还答应用++和–运算符,其实这儿有误导,由于++和–能够作为前缀和后缀,这样的话他们就有或许改动操作数的值,下面让咱们来看看:

  i = 1;

  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++)没变,

  2.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来替代3.1415926

  2.宏界说是用宏来替代字符串也便是做简略的置换,不做正确性查看假如写成

  define PI 3.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)

  3.typedef和#define的差异

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

  typedef char *String1;

  define String2 char *

  String1 s1,s2;

  String2 s3,s4;

  s1,s2,s3 被界说为了char* 但s4却被界说为了char型

  3. 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文件中,该变量是不行见的(你不能用).

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

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

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

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

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

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

  {……}

  关键字“static”,译成中文便是“静态的”,所以内部函数又称静态函数。但此处“static”的意义不是指存储方法,而是指对函数的效果域仅局限于本文件。

  运用内部函数的优点是:不同的人编写不同的函数时,不必忧虑自己界说的函数,是否会与其它文件中的函数同名,由于同名也没有联系。

  2 外部函数

  外部函数的界说:在界说函数时,假如没有加关键字“static”,或冠以关键字“extern”,表明此函数是外部函数:

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

  {……}

  调用外部函数时,需要对其进行阐明:

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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/beidong/114843.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部