正文内容
C语言全局变量那些事儿
来源:漫步者
作者:开心麻花
2025-09-17
1

C语言全局变量那些事儿(精选4篇)

C语言全局变量那些事儿 第1篇

C语言怎样定义和声明全局变量和函数最好

首先, 尽管一个全局变量或函数可以(在多个编译单元中) 有多处“声明”, 但是“定义” 却只能允许出现一次,定义是分配空间并赋初值(如果有) 的声明。

最好的安排是在某个相关的.c 文件中定义, 然后在头文件(.h) 中进行外部声明, 在需要使用的时候, 只要包含对应的头文件即可。定义变量的.c 文件也应该包含该头文件, 以便编译器检查定义和声明的`一致性。这条规则提供了高度的可移植性: 它和ANSI C 标准一致, 同时也兼容大多数ANSI 前的编译器和连接器,

Unix 编译器和连接器通常使用“通用模式” 允许多重定义, 只要保证最多对一处进行初始化就可以了; ANSI C 标准称这种行为为“公共扩展”, 没有语带双关的意思。

可以使用预处理技巧来使类似DEFINE(int, i);的语句在一个头文件中只出现一次, 然后根据某个宏的设定在需要的时候转化成定义或声明。

但不清楚这样的麻烦是否值得。如果希望让编译器检查声明的一致性, 一定要把全局声明放到头文件中。特别是, 永远不要把外部函数的原型放到.c 文件中: 通常它与定义的一致性不能得到检查, 而矛盾的原型比不用还糟糕。

如何合理设置C语言变量 第2篇

关键词:变量,存储类型,数据类型

由于C语言通过编译,转换成机器语言后,才能被CPU执行,所以要掌握好C语言,就需要了解C语言的语句转变成机器语言之后的情况。下面通过对变量的存储类型和数据类型的分析,来观察一下变量在程序中的具体表现形式。

一.auto、register、static三种存储类型的比较

1. C语言中auto型变量的保存及调用

例1:在turboc2.0编写一个带有auto型变量的程序并分析。

把此程序编译生成e x e文件后,用W32Dasm.exe把这个应用程序文件进行反汇编,可以找到如下4行有关变量a的汇编代码:

从这4句汇编语句可以发现:

(1)通过减法语句sub sp, 0002让sp=sp-2,给变量a让出2B的堆栈空间;

(2)通过传送语句mov word ptr[bp-02], 0001把1放入内存的堆栈段的地址为bp-2和bp-1之中,从而完成a=1的赋值操作。

2. register变量的保存及调用

例2:对带有一个register型变量的程序进行分析。

对其产生的应用程序反汇编后,可以找到如下2行有关变量a的汇编代码:

(1)语句push si表示将CPU中的寄存器si中的数据通过压入堆栈区保存起来,从而腾出si的空间,让si暂时作为变量a的存储空间;

(2)语句mov si, 0001完成赋值a=1。

由于直接使用CPU中的寄存器si代表变量a,而不是使用内存空间代表变量a,从而使CPU对变量a的操作速度远远超过内存变量的操作速度。

例3:对带有4个register变量的程序进行分析。

对其产生的应用程序反汇编后,可以找到如下7行有关变量a、b、c、d的汇编代码:

从这7条汇编语句可以看出,由于CPU中的寄存器很少,只能用寄存器si作为变量a,寄存器di作为变量b,而变量c、d自动转为auto型,将它们创建于内存的堆栈区中。

例4:对带有3个auto变量的程序进行分析。

通过对其应用程序的反汇编可以看出,编译系统自动将变量a、b转换成寄存器型变量,即用寄存器si代表变量a,用寄存器di代表变量b,而把c创建于内存的堆栈区。这样编译,可以明显加快程序的运行速度。

3. static变量的保存及调用

例5:对带有一个static型变量的程序进行分析。

对其产生的应用程序反汇编后,可以找到如下有关变量a的汇编代码:

由于没有使用堆栈指针sp,也没有使用寄存器,所以变量a存在于内存的数据段中,而非堆栈段。在这个语句中,用了地址01A6和01A7来存放1。地址01A6和01A7就是变量a的存储空间。若源程序:

则变量a也存在于内存数据段中。

例6:对子函数中带有一个static型变量的程序进行分析。

对其产生的应用程序反汇编后,可以找到调用子函数f () 的5行汇编代码:

可以看出:调用了函数f () 后,通过传送语句mov word ptr[01A6], 0001完成a=1的赋值。但在子程序返回(语句ret表示子程序返回)时,地址01A6和01A7并没有释放,说明静态变量的生命周期与整个程序的生命周期相同。

二.如何选择变量的数据类型

1.对二个不同类型的变量进行赋值的程序分析

例7:用VC++6.0编程,将unsigned short类型的变量值传递给double的变量

对其产生的应用程序反汇编后,可以找到如下6行汇编代码:

显然,本例子的赋值语句比上例所用的时钟少得多。

2.带符号整数除法比无符号整数除法要慢一些。因为它不仅增加了扩展长度的指令cdq,且带符号除法指令idiv比无符号除法指令div的时钟周期要长。

三.结论

1.若某个变量参与了循环,最好把它设置成寄存器变量;

2.若需要提高内存的利用率,则在子函数中设置auto型变量,从而在子函数结束时,及时释放变量所占空间;

3.对static型变量操作的汇编语句数量少于auto型变量;

4. CPU对整数操作所用的时间要少于浮点数;

5.带符号整数的除法比无符号整数除

法要慢一些,所以在不存在负数的情况下,优先使用unsigned类型的整数。

参考文献

随机变量的那些事儿 第3篇

某批产品成箱包装,每箱5件.一用户在购进该批产品前,先从中取出3箱,再从每箱中任意抽取2件产品进行检验.设取出的第一、二、三箱中分别有0件、1件、2件二等品,其余均为一等品.问:

(1) 抽到的6件产品中二等品的件数可能有哪些情况?每种情况出现的概率各是多少?

(2) 平均能抽到几件二等品?

让我们都来问问自己!

上面的问题在“选修23”教材的“概率”一章中经常能见到.

“从每箱中任意抽取2件产品”是一个随机试验,这个试验的结果——抽到的二等品的件数——可能是0件、1件、2件或3件.为方便研究,我们引入变量X,X=0表示没有抽到二等品,X=1表示抽到1件二等品,X≥2表示抽到2件或2件以上二等品……这样,这个试验的结果和数集{0,1,2,3}就建立了一个对应关系,实现了随机试验结果的“数字化”!这里的变量X就是随机变量.

由于X=0表示在各箱中都没有抽到二等品,根据相互独立事件同时发生的概率公式,得

P(X=0)=C24C25•C23C25=18100=950.

同样,可得P(X=1)=C11C14C25•C23C25+C24C25•C12C13C25=1225,P(X=2)=

C11C14C25•C12C13C25+C24C25•C22C25=1550,P(X=3)=C11C14C25•C22C25=125.

于是X的概率分布表为:

X0123

P95012251550125

平均能抽到几件二等品?这里要求的是随机变量X取值的平均水平,我们称它为随机变量的数学期望. 数学期望表现为大量重复试验下的平均水平,是随机变量的一个重要的数字特征.

本问题中,可由数学期望的定义,求出E(X)=0×950+1×1225+2×1550+3×125=65.平均能抽到12件二等品.

原来可以这么做!

由上面的问题可以看出,对“概率”一章的学习,首先要理解(离散型)随机变量的概念,其次要会计算随机变量取某值(这是一个随机事件)的概率,最后还要会分析随机变量的期望和方差等数字特征.

例1 某电视台的一个智力游戏节目中,有一道“将四本由不同作者所著的外国名著A,B,C,D与它们的作者连线”的题目,每本名著只能与一名作者连线,每名作者也只能与一本名著连线.每连对一个得3分,连错一个扣1分.一名观众随意连线,记他的得分为ξ,试求ξ的概率分布及数学期望.

分析 该观众连对的题目数可能为0,1,2或4,相应的得分ξ可能为-4,0,4或12.由排列、组合知识及古典概型概率公式可求出ξ的概率分布.

解 ξ可能的取值为-4,0,4,12,且P(ξ=-4)=9A44=924,P(ξ=0)=C14×2A44=824=13,P(ξ=4)=C24A44=624=14,P(ξ=12)=1A44=124.

于是ξ的概率分布表为:

ξ-40412

P9241314124

ξ的数学期望E(ξ)=-4×924+4×14+12×124=0.

评注 解本题时,很多同学常常会认为该观众连对的题目数可能为0,1,2,3或4!事实上,该观众是不可能只连对3个题目的.这要求我们要认真领会和分析问题的背景,准确写出随机变量可能的取值,这是正确解题的第一步!

例2 袋子里有大小相同的5个白球和3个黑球,从中随机取出4个球,设取出的白球的个数为ξ.

(1) 求取出2 个或3个白球的概率;

(2) 求至少取出1个黑球的概率;

(3) 求ξ的概率分布及数学期望.

分析 ξ可能的取值为1,2,3,4,且P(ξ=1)=C15C33C48=114,

P(ξ=2)=C25C23C48=37,P(ξ=3)=C35C13C48=37,P(ξ=4)=C45C48=114.

解 (1) 取出2个或3个白球的概率为P(ξ=2)+P(ξ=3)=67.

(2) 至少取出1个黑球的概率为P(ξ≤3)=1-P(ξ=4)=1314.

(3) ξ的概率分布列为P(ξ=r)=Cr5C4-r3C48(r=1,2,3,4).

ξ的数学期望E(ξ)=1×114+2×37+3×37+4×114=3514=52.

评注 仔细品味本题,可以发现这里的ξ服从超几何分布.本题描述的抽样是不放回抽样,即在共有N个元素的集合中含有M个“另类”元素,从该集合中随机取出n个元素,研究取出的n个元素中含有的“另类”元素的个数. 同学们要认真把握其特征,比如在一批产品中含有正品和次品、在一群人里包含男人和女人、在一袋子球中含有白球和黑球等问题.本题中,ξ~H(4,5,8),这里ξ是取出的白球的个数,4是取出的球的个数,5是袋中白球的个数,8是袋中白球和黑球的总个数.实际上,若ξ~H(n,M,N),则E(ξ)=nMN.故这里求数学期望时,可直接使用该公式,得E(ξ)=4×58=52,这样更简捷.

例3 某校设计了一个实验学科的考查方案:考生从6道备选题中一次性随机抽取3道题,规定至少正确完成其中2道题方可通过.已知6道备选题中,考生甲有4题能正确完成,2题不能正确完成;考生乙每题正确完成的概率都是23,且每题正确完成与否互不影响.

(1) 分别写出甲、乙两个考生正确完成的题数的概率分布,并计算其数学期望;

(2) 试用统计知识分析比较两个考生的实验操作能力.

分析 不难发现,甲正确完成的题数服从超几何分布,乙正确完成的题数服从二项分布;两个考生的实验操作能力可通过他们正确完成的题数的数学期望和方差来进行比较.

解 (1) 记“考生甲、乙正确完成的实验操作题数”分别为ξ,η.

由题意,得ξ~H(3,4,6),故P(ξ=1)=C14C22C36=15,P(ξ=2)=C24C12C36=35,P(ξ=3)=C34C02C36=15,E(ξ)=3×46=2.

η~B3,23,故P(η=r)=Cr323r133-r

(r=0,1,2,3),E(η)=3×23=2.

(2) 由(1),知V(ξ)=(1-2)2×15+(2-2)2×35+(3-2)2×15=25,V(η)=3×23×13=23,

所以V(ξ)<V(η).

而P(ξ≥2)=35+15=45,P(η≥2)=49+827=2027,所以P(ξ≥2)>P(η≥2).

综上,可知从正确完成的题数的数学期望来考察,甲、乙两人水平相当;从正确完成的题数的方差来考察,甲较稳定;从至少正确完成2题的概率来考察,甲获得通过的可能性较大.

因此可以判断甲的实验操作能力较强.

评注

随机变量的方差、标准差反映了随机变量的取值偏离于平均值(期望)的离散程度.求(离散型)随机变量ξ的方差、标准差的步骤如下:①理解ξ的意义,写出ξ所有可能的取值;②求ξ取各个值的概率,写出ξ的概率分布;③根据ξ的概率分布,由期望的定义求出E(ξ)(若ξ~H(n,M,N),或ξ~B(n,p),则可直接应用公式计算E(ξ));④根据E(ξ),由方差、标准差的定义求出V(ξ)(即σ2)和V(ξ)(即σ)(若ξ~B(n,p),则不必写出ξ的概率分布,而可直接应用公式计算V(ξ)和V(ξ)).

能给点启示吗?

在处理随机变量问题时,首先要确定问题中的随机变量的所有可能的取值;然后要把随机变量取各个值作为一个个随机事件,分别求出它们发生的概率.而求概率时,往往需要将所研究的事件分为若干个互斥的事件之和或若干个相互独立的事件之积,从而用概率的加法公式或乘法公式来解.在解决问题后,要有反思的习惯,反思问题的结果是否有实际意义,反思解决问题的过程和方法是否合理.

在求随机变量的概率分布时,要注意以下两个条件:①pi≥0,i=1,2,…,n,②p1+p2+…+pn=1.这两个性质可以帮助我们检验所得的概率分布是否正确.

先写出概率分布是求随机变量的均值和方差的最基本的方法;此外,对于常见的两点分布、二项分布、超几何分布等,还可直接使用公式求出均值和方差,这样可以提高解题的效率.

巩 固 练 习

1. 某人投篮,每次投中的概率都是25,用ξ表示他投篮3次的进球数,则随机变量ξ的标准差V(ξ)=.

2. 已知随机变量ξ~B(n,p),且E(2ξ+1)=58,V(2ξ+1)=5.76,则n= ,p= .

3. 某次乒乓球比赛的决赛在甲、乙两名选手之间举行,比赛采用五局三胜制,按以往的比赛经验,每局比赛甲胜乙的概率均为23.

(1) 求比赛三局甲获胜的概率;

(2) 求甲获胜的概率;

(3) 设甲比赛的局数为X,求X的数学期望.

C语言中变量的理解 第4篇

关键词:C语言,变量,变量的重要性

一、变量的概念

程序设计就是让计算机按照一定的指令来进行工作, 可以说数据的处理是程序设计的主要任务。那么数据是怎么加入到计算机的内存中呢?计算机最初的功能就是能够存储数据并处理数据的机器。那么数据是怎么加入到计算机的内存中呢?在学习程序设计之前, 很多学生对计算机的硬件设施都大概已经很熟悉了。计算机的硬件设施中有一个区域是用来存储数据的, 计算机在工作的过程中会频繁的从这个区域读入和读出数据。要想让计算机按照某些指令 (程序) 自动工作, 首先必须把数据存储到计算机的存储空间中。在某种计算机语言中实现这种数据存储功能的就是变量。变量就是计算机内存中的某一个存储单元。

二、变量的定义

C语言中变量在使用之前必须先对其进行定义, 变量的定义的一般形式如下:

【存储类别】数据类型变量名;

其中存储类别是可以省略的。

1、存储类别

计算机的内存一般分为三个部分:1) 程序区;2) 静态存储区;3) 动态存储区;为了高效的发挥计算机的功能, 不同类型的变量存放在不同的内存区域。变量的存储类别决定了变量中的数据在计算机内存中的存储位置。C语言中局部变量存放在动态存储区, 全局变量或者静态变量存放在静态存储区。

2、数据类型

在用程序处理问题之前, 首先必须确定用何种方式描述问题中所涉及到的数据。这个问题在C语言中是由数据类型来决定的。变量的本质表现为在计算机中的存在时间和存储空间。变量的数据类型是用来决定变量在计算机中占用内存空间的大小。比如:整型数据在TC编译系统中占用两个字节的存储空间。C语言变量的类型不仅确定了数据在计算机内存中的存储区域的大小, 同时确定了该数据能够参与的各种运算。任何一个C语言的变量必须有确定的数据类型, 不管这个变量如何变化, 变量的值都必须符合该变量数据类型的规定。

3、变量的名字

通过以上介绍我们知道C语言中的变量就是计算机的某个存储单元, 假设你给某个变量赋予了一个数值, 对变量的处理其实就是对这个数据的处理。那么计算机是如何快速准确的找到这个数据呢?计算机的内存是以字节为单位进行划分的。每个存储单元都有自己的地址编号, 就向宾馆中房间的房间号一样。计算机就是通过地址来准确的确定数据的存储位置。但是对于程序员特别是非专业计算机人士, 如果用计算机内存地址记录数据是非常难操作的。为了更好的掌控变量, C语言规定可以给每个变量其一个容易识别的名字。这个名字的命名规则遵循C语言的标识符命名规则。

C语言的变量名的命名在遵循C语言标识符规则的前提下, 原则上可以是任意长度字符的组合。但是目前很多的C语言编译系统只能识别前31个字符, 如果两个变量的前31个字符相同, 则编译系统会认为这两个变量时同一个变量。为了避免这种混淆的出现最好避免使用多余31个字符的变量名。

二、变量的理解

变量就是计算机中的某个存储单元。定义某个变量本质上就是向计算机申请一些存储区域。这个存储区域的大小由变量的数据类型决定, 这个存储区域的位置有变量的存储类类别决定。给变量赋予某个数值, 其实就是向该变量对应的存储单元读入数据, 对变量的处理就是对这个存储单元中的数据的处理。并且这个存储单元中的数据在程序的运行期间是可以发生变化的。

三、变量的分类

变量的分类一般从时间和空间两个角度来划分:

1、从空间的角度及变量的作用域来考虑可以把变量分为局部变量和全局变量。

1) 局部变量

在函数内部声明的变量叫局部变量。它的作用范围仅仅局限于函数内部, 在函数调用期间, 变量会存在于计算机的内存中, 当函数返回时, 内存中的变量便会释放其所占用的内存单元, 变量的值也消失掉。

2) 全局变量

在函数外部定义的变量叫全局变量。它的作用范围从定义其的位置开始到整个文件结束。和局部变量相同, 全局变量以某种方式保存在内存中, 在这种方式下它的值不会受到函数调用的影响。程序的任何一个模块都可以使用这个变量。在函数返回时, 这些变量的值是不会丢失的。全局变量保持相同的值直到它被赋予新的数值为止。一般用在当函数调用之间需要维护一些内部状态不变时使用。

3) 使用全局变量要注意的地方

许多新的程序员很喜欢使用全局变量。全局变量不受函数调用的影响, 可以被任何一个模块所使用。但是, 很多有经验的程序员则对使用全局变量的问题非常慎重。因为, 如果你在查找一个变量导致程序错误的问题。这个变量如果是全局变量, 它的改变可以在程序的任何模块, 那么, 问题可能出现在程序的任何地方。而如果这个变量是局部变量, 则它的问题只会局限在程序中的一个地方。为了避免这种问题的出现, 应该尽量少的使用全局变量。

2、从时间的角度来分, 可以把变量分为动态存储和静态存储两种类型。

1) 动态存储只有在函数调用期间变量才会存在, 它们存在于计算机的动态存储区域。最典型的就是函数的形式参数, 在函数为被调用时, 这些变量是不存在与计算机的内存中的。当函数调用时, 形式参数会得到自己独立的存储空间, 在函数调用期间存在于计算机的内存中。随之函数调用的结束, 这些变量的生命期也结束了。

2) 静态存储时程序的整个运行期间都存在于计算机的内存中, 它们存在于计算机的静态存储区域。这种类别的变量一旦被定义, 就一直存在于计算机的内存中, 不受函数调用的影响。

四、小结

C语言的变量包含的内容非常丰富, 本文仅从局部对其进行了总结和分析, 希望对读者对计算机语言中变量概念的理解有一定的帮助。

参考文献

[1]谭浩强.C语言程序设计.北京:清华大学出版社, 2008.3

相关文章
百万元活动开展全年工作安排

百万元活动开展全年工作安排

百万元活动开展全年工作安排(精选5篇)百万元活动开展全年工作安排 第1篇关于2012年“百万元收费无差错”活动工作安排的报告平凉高速公路...

1
2025-09-17
八年级语文参考答案

八年级语文参考答案

八年级语文参考答案(精选10篇)八年级语文参考答案 第1篇1.略2、D3.D4.B5.C6、D6、①风掣红旗冻不翻②将登太行雪满山③身世浮沉雨打萍...

1
2025-09-17
安全培训教育感想

安全培训教育感想

安全培训教育感想(精选14篇)安全培训教育感想 第1篇珍爱生命,安全第一通过观看电影“红色生命”,颇有感触,看到生命在火灾面前真的很...

1
2025-09-17
保安经理工作职责

保安经理工作职责

保安经理工作职责(精选18篇)保安经理工作职责 第1篇龙之泉国际会所中文职称:保安经理部门名称:保安部直属上司:行政部直属下级:保安...

1
2025-09-17
保洁日常工作范文

保洁日常工作范文

保洁日常工作范文(精选12篇)保洁日常工作 第1篇高笋塘街道清扫保洁员工作职责为加强保洁员管理,提高保洁质量,提升城市形象,特制定本...

1
2025-09-17
百年校庆征文启事共

百年校庆征文启事共

百年校庆征文启事共(精选5篇)百年校庆征文启事共 第1篇一大早,当我穿着崭新的校服来到学校时,学校门口已经竖起了彩虹门,建设小学百年...

1
2025-09-17
八一农垦大学范文

八一农垦大学范文

八一农垦大学范文(精选9篇)八一农垦大学 第1篇黑龙江八一农垦大学飞行技术专业(飞行学员)招生简章黑龙江八一农垦大学是一所具有鲜明农垦...

1
2025-09-17
B超测量范文

B超测量范文

B超测量范文(精选7篇)B超测量 第1篇1 资料与方法1.1 一般资料选取该院收治110例进行子宫全切除术患者, 患者的年龄在21~68岁之间, 所...

1
2025-09-17
付费阅读
确认删除?
回到顶部