【转】在单片机中,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;

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

  • 先按定义变量的方法写出定义体(如 unsigned int i)
  • 在变量名换成新的变量名(如将 i换成u16)
  • 在最前面加上typedef (typedef unsigned int u16)
  • 然后用新类型名去定义变量

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型

4. static 变量

static变量大致分为三种用法

  • 用于局部变量中,成为静态局部变量. 静态局部变量有两个用法,记忆功能和全局生存期;
  • 用于全局变量,主要作用是限制此全局变量被其他的文件调用;
  • 用于类中的成员.表示这个成员是属于这个类但是不属于类中任意特定对象。

4.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++;

}

4.2 静态全局变量

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

4.3 static的类成员变量

static关键字有两种意思,要看上下文来判断:

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

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

5 static 函数 —— 内部函数和外部函数

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

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

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

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

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

{……}

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

使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。

5.2 外部函数

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

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

{……}

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

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

来源

原文地址:https://www.cnblogs.com/skullboyer/p/8250925.html

时间: 2024-10-18 23:02:58

【转】在单片机中,C语言的一些误用和总结!的相关文章

单片机中C语言的程序与数据存储

单片机中C语言的程序与数据存储 一.五大内存分区: 内存分成5个区,它们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 1.栈区(stack):FIFO就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等. 2.堆区(heap):就是那些由new分配的内存块,它们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete.如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收. 3.自由存储区:就是那些

浅谈单片机中C语言与汇编语言的转换

做了一单片机设计,要用C语言与汇编语言同时实现,现将这次设计的感受和收获,还有遇到的问题写下,欢迎感兴趣的朋友交流想法,提出建议. 单片机设计:基于51单片机的99码表设计 软件环境:Proteus8.0 + Keil4 要求:1,开关按一下,数码管开始计时.2,按两下,数码管显示静止.3,按三下,数码管数值清零. C语言程序如下: 1 #include<reg51.h> 2 #define uint unsigned int 3 #define uchar unsigned char 4 u

【转载】单片机中c语言“右移&gt;&gt;和左移&lt;&lt;”与CY

======================================================== 左移 << 0100 1111  << 1   左移一位:1001 1110  CY=0 : 移出去的MSB跑到CY上,最后一位补0 : ======================================================== 右移>>1000 1111 >>1    右移一位:0100 0111  CY=1 : 移出去的

12中IT语言的特点

软件开发这个行业的武器就是编程语言.IT发展到今天,产生了种类繁多的编程语言,有的古老却任然使用,有的新生而激情四射,有的只是昙花一现就黯然消逝,有的则从诞生之日就不断 发展壮大.选择何种编程语言平台,便是摆在很多希望步入IT行业人面前的首道难题. 1.Java Java语言自1995年发布以来,由于其面向对象.跨平台和分布式的特性迅速风靡整个IT界.加之Sun.Oracle.IBM等行业巨头的大力支持,以及众多开发者为其设计的各种框架技术使得Java技术涵盖了当今软件开发的几乎所有方面.其中,

为什么单片机中既有Flash又有EEPROM

单片机运行时的数据都存在于RAM(随机存储器)中,在掉电后RAM 中的数据是无法保留的,那么怎样使数据在掉电后不丢失呢?这就需要使用EEPROM 或FLASHROM 等存储器来实现. 插播一段:ROM最初不能编程,出厂什么内容就永远什么内容,不灵活.后来出现了PROM,可以自己写入一次,要是写错了,只能换一片.随着不断改进,终于出现了可多次擦除写入的EPROM,每次擦除要把芯片拿到紫外线上照一下,想一下你往单片机上下了一个程序之后发现有个地方需要加一句话,为此你要把单片机放紫外灯下照半小时,然后

单片机中应用观察者模式

?? 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN8 开发环境:MDK5.13 mcu: stm32f103RB 说明: 之前在java中应用观察者模式,现将此模式的思想应用在单片机程序设计中 Android编程:观察者模式设计: http://blog.csdn.net/jdh99/article/details/41821295 观察者模式本质: 有两个模块A,B.A是目标,B是观察者.则B能观察到A的变化. 在程序实现

51单片机入门1--与C语言的交接

我们即将进入51单片机的编程学习,咱们今天就来讲解一下单片机中的C语言(你可以称作C51) 在说编程之前,要先说一些别的东西: 二进制,八进制,十六进制 二进制中只有数字0和1,在二进制中1+1为10,我们常说十进制逢十进一,那二进制就是逢二进一,那为什么我会在这里说二进制呢,因为我们的51单片机的io口是可以接受发送低电平和高电平的,意思就是输入输出的口只有0和1两个状态,所以如果我们理解了二进制,那么对于单片机的输入和输出就会十分明了了 八进制,学过C语言,咱们都知道,在C语言中其实是不能直

OJ提交题目中的语言选项里G++与C++的区别(转载)

原文链接:http://blog.polossk.com/201405/c-plus-plus-g-plus-plus G++? 首先更正一个概念,C++是一门计算机编程语言,G++不是语言,是一款编译器中编译C++程序的命令而已. 那么他们之间的区别是什么? 在提交题目中的语言选项里,G++和C++都代表编译的方式.准确地说,选择C++的话,意味着你将使用的是最标准的编译方式,也就是ANSI C++编译.如果你使用的是G++的话,意味着你将使用GNU项目中最平凡适用人群最多的编译器(其实也就是

Windows Store App 全球化:应用中设置语言选项

当开发者将开发的应用上传到Windows应用商店以后,使用Windows 8系统的用户可能会看到并下载这些应用,而这些用户所在的区域或者所使用的语言可能都不相同,如果他们在使用应用程序时希望改变应用显示信息的语言为自己所熟悉的语言,这就需要应用能够提供一个语言设置选项,并在选项中包括用户所在地区的语言,这样就能够在应用中更加准确的为用户提供所需要的界面语言而不受区域的影响.下面将通过示例讲解如何在应用中添加"语言设置"选项,通过设置应用的语言来显示不同的信息. 新建一个Windows应

《十天学会单片机和C语言编程》

大家注意了这个文件只有最新版迅雷可以下载,下面的lesson几就是第几课.点击右键使用迅雷下载. ed2k://|file|[十天学会单片机和C语言编程].Lesson1.rar|449712628|262b8896ad6828cd33ed7189fe94cb2d|h=76MXIF34BFV3VUPLLBN3ASNOVCACHTO3| ed2k://|file|[十天学会单片机和C语言编程].lesson10.rar|667224261|ed9eb3658e78db507b7feeb40ec82