当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 学习笔记 > 嵌入式学习笔记:C语言之变量、其生命周期、运算符详解

嵌入式学习笔记:C语言之变量、其生命周期、运算符详解 时间:2018-09-18      来源:未知

1、变量

定义:创建一个对象,为这个对象分配一块内存,并为它取一个名字,这个名字就叫做变量名;是对程序中数据的存储空间的抽象。

存储类型 数据类型 变量名;

描述:

一个变量可以通过不同种的方式来描述。

存储期:

变量在内存中的保存时间

作用域:

程序的哪些部分通过变量名来使用变量

链接点:

程序的哪些部分通过变量名来使用变量

全局变量:也称为外部变量,定义在函数体外部的变量,不属于哪个函数,属于整个

程序;

局部变量:也称为内部变量,定义在函数体内部的变量,只能在函数内部使用;

存储类型:auto register static extern

auto:声明的变量是自动变量,声明的变量存放在堆栈区,而且auto可以省略。

register:寄存器型,声明的变量放在CPU内部的寄存器中,可以加快程序的运

行速度,如果申请不到,同auto;

定义与声明的区别:定义分配内存,声明不分配内存;

extern:

1、声明的变量必须是全局变量;

2、编译时必须同时编译两个文件;

3、声明的变量必须被定义过。

static:

1、修饰局部变量,如果该局部变量没有被初始化,其值为0,并且该局部变量只会被初始化一次;生命周期发生改变。

注:局部变量如果没有被初始化,其值为随机值;

2、修饰全局变量,该全局变量只能在本文件内使用;

3、修饰函数时,该函数只能在本文件内使用;

注:

1、具有外部链接的在其他文件使用前必须以exturn声明

2、具有静态存储期的变量必须使用常量初始化(编译阶段获得值)

-------与auto最大不同点是:static存储类型的变量在内存中是以固定地址存放的,而不是以堆栈方式存放的;只要整个程序还在继续运行静态变量就不会随着说明它的程序段的结束而消失,它下次再调用该函数,该存储类型的变量不再重新说明,而且还保留上次调

用存入的数值。

2、动态存储方式与静态存储方式

变量还有另一种属性——存储期(storage duration,也称生命期)。存储期是指变量在内存中的存在期间。这是从变量值存在的时间角度来分析的。存储期可以分为静态存储期(static storage duration)和动态存储期(dynamic storage duration)。这是由变量

的静态存储方式和动态存储方式决定的。

所谓静态存储方式是指在程序运行期间,系统对变量分配固定的存储空间。而动态存储方式则是在程序运行期间,系统对变量动态地分配存储空间。

先看一下内存中的供用户使用的存储空间的情况。这个存储空间可以分为三部分,即:

程序区

静态存储区

动态存储区

数据分别存放在静态存储区和动态存储区中。全局变量全部存放在静态存储区中,在程序开始执行时给全局变量分配存储单元,程序执行完毕就释放这些空间。在程序执行过程中它们占据固定的存储单元,而不是动态地进行分配和释放。

在动态存储区中存放以下数据:

函数形式参数。在调用函数时给形参分配存储空间。

函数中的自动变量(未加static声明的局部变量,详见后面的介绍)。

函数调用时的现场保护和返回地址等。

对以上这些数据,在函数调用开始时分配动态存储空间,函数结束时释放这些空间。在程序执行过程中,这种分配和释放是动态的,如果在一个程序中两次调用同一函数,则要进行两次分配和释放,而两次分配给此函数中局部变量的存储空间地址可能是不相同

的。

如果在一个程序中包含若干个函数,每个函数中的局部变量的存储期并不等于整个程序的执行周期,它只是整个程序执行周期的一部分。根据函数调用的情况,系统对局部变量动态地分配和释放存储空间。

在C++中变量除了有数据类型的属性之外,还有存储类别(storage class) 的属性。存储类别指的是数据在内存中存储的方法。存储方法分为静态存储和动态存储两大类。具体包含4种:自动的(auto)、静态的(static)、寄存器的(register)和外部的(extern)。根据变量的存储类别,可以知道变量的作用域和存储期。对静态局部变量的说明:

静态局部变量在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,存储在动态存储区空间(而不是静态存储区空间),函数调用结束后即释放。

为静态局部变量赋初值是在编译时进行值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。而为自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。

如果在定义局部变量时不赋初值的话,对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符型变量)。而对自动变量来说,如果不赋初值,则它的值是一个不确定的值。这是由于每次函数调用结束后存储单元已释放,下次调用时又重新另分

配存储单元,而所分配的单元中的值是不确定的。

虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的,也就是说,在其他函数中它是“不可见”的。

3、生命周期与作用域

局部变量:

生命周期:从定义开始,到该模块结束

作用域:该模块内

static修饰的局部变量:

生命周期:从定义开始,到整个程序结束

作用域:该模块内

全局变量:

生命周期:从定义开始,到整个程序结束

作用域:该程序内

static修饰的全局变量:

生命周期:从定义开始,到整个程序结束

作用域:该文件内

注:全局变量如果没有被初始化,其值为0;全局变量要慎用,原因有两个:

1、命名重复

2、其他函数可能违背意图将其值改变

4、类型转换

1、隐式类型转换

(1)低字节数向高字节数转换

(2)有符号数向无符号数转换(int ---> unsigned int)

2、强制类型转换

(数据类型)变量名;

注:不管是隐式类型转换还是强制类型转换,实际上变量的类型并没有发生变化,只是在运算的过程当中发生了转换。

5、运算符

算术运算符、关系运算符、逻辑运算符、位运算符

1、算术运算符:+ - * / % ++ --

%:取模运算,小数没有取模运算

++

int a = 5;

int b

= a++;

a = 7, b = 5, c = 7

注:

++在前,先赋值,后运算

++在后,先运算,后赋值

当++单独成一条语句时,++在前和在后没有区别;

2、关系运算符 > < >= <= == !=

注:

=为赋值运算符

==为等于号

if(5 == a)

3、逻辑运算符 && || !

表达式1 && 表达式2

表达式1和表达式2同时成立,整个表达式才成立,只要其中有一个不成立,整个表达式就为假

截断法则:当&&左边为假时,其值一定为假,所以&&右边就不执行

表达式1 || 表达式2

||两边同时为假时,其值才为假,只要有一边表达式为真,其值一定为真截断法则:当||左边为真时,其值一定为真,右边不执行

4、位运算符:~ & | ^ >> <<

~00001111 11110000

&:00100010

10110000

00100000

1)、判断某个数的某一位或某几位是0还是1

10011011 判断第四位是0还是1

& 00010000

00010000

2)、清除某个数的某一位或某几位

10011011 清除第3到5位

& 11000111

10000011

3)、设置某个数的某一位或某几位 (先清0,后设置)先与后或

10011011 设置第3到5位为101

& 11000111

| 00101000 10101011

^:两个位进行异或时,相同为0,不同为1

一个数与0相异或,结果是其本身

翻转某个数的某一位段

1100 0001 翻转第3到5位

^ 00111000

11111001

>>:右移

1、溢出部分不要

2、高位:正数 高位补0

负数 补1

<<:左移

1、溢出时,溢出部分不要,右边补0

2、如果是有符号数,可能会引起符号位的改变

5、逗号运算符:

表达式1,表达式2;

其求值过程是分别求两个表达式的值,并以表达式2的值作为整个逗号表达

式的值。

表达式1,表达式2,表达式3,。。。。。。。。表达式n;

每个表达式都会执行,并把表达式n的值作为整个表达式的值。

上一篇:嵌入式学习笔记:数据的输入输出

下一篇:嵌入式学习笔记:守护进程,线程详解

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部