- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C 外部变量
C语言程序可以看成由一系列的外部对象构成,这些外部对象可能是变量或函数。形容词external 与internal 相对的,internal 用于描述定义在函数内部的函数参数及变量。外部变量定
义在函数之外,因此可以在许多函数中使用。由于C语言不允许在一个函数中定义其它函数, 因此函数本身是“外部的”。默认情况下,外部变量与函数具有下列性质:通过同一个名字对
外部变量的所有引用(即使这种引用来自于单独编译的不同函数)实际上都是引用同一个对象(标准中把这一性质称为外部链接)。在这个意义上,外部变量类似于Fortran 语言的
COMMON块
何定义只能
或Pascal 语言中在最外层程序块中声明的变量。我们将在后面介绍如
在某一个源文件中使用的外部变量与函数。
因为外部变量可以在全局范围内访问,这就为函数之间的数据交换提供了一种可以代替 函数参数与返回值的方式。任何函数都可以通过名字访问一个外部变量,当然这个名字需要通过某种方式进行声明。
如果函数之间需要其享大量的变量,使用外部变量要比使用一个很长的参数表更方便、
有效。但是,我们在第1 章中已经指出,这样做必须非常谨慎,因为这种方式可能对程序结构产生不良的影响,而且可能会导致程序中各个函数之间具有太多的数据联系。
外部变量的用途还表现在它们与内部变量相比具有更大的作用域和更长的生存期。自动 变量只能在函数内部使用,从其所在的函数被调用时变量开始存在,在函数退出时变量也将
消失。而外部变量是永久存在的,它们的值在一次函数调用到下一次函数调用之间保持不变。因此,如果两个函数必须共享某些数据,而这两个函数互不调用对方,这种情况下最方便的 方式便是把这些共享数据定义为外部变量,而不是作为函数参数传递。
下面我们通过一个更复杂的例子来说明这一点。我们的目标是编写一个具有加(+)、减
(-)、乘(*)、除(/)四则运算功能的计算器程序。为了更容易实现,我们在计算器中使用
逆波兰表示法代替普通的中辍表示法(逆波兰表示法用在某些袖珍计算器中,Forth与
Postscript
等语言也使用了逆波兰表示法)。
在逆波兰表示法中,所有运算符都跟在操作数的后面。比如,下列中缀表达式:
(1 – 2) * (4 + 5)
采用逆波兰表示法表示为:
1 2 - 4 5 + *
逆波兰表示法中不需要圆括号,只要知道每个运算符需要几个操作数就不会引起歧义。 计算器程序的实现很简单。每个操作数都被依次压入到栈中;当一个运算符到达时,从 栈中弹出相应数目的操作数(对二元运算符来说是两个操作数),把该运算符作用于弹出的操
作数,并把运算结果再压入到栈中。例如,对上面的逆波兰表达式来说,首先把1 和2 压入到栈中,再用两者之差-1 取代它们;然后,将4 和5压入到栈中,再用两者之和9取代它们。最后,从栈中取出栈顶的-1和9,并把它们的积-9 压入到栈顶。到达输入行的末尾时,把栈顶
的值弹出并打印。
这样,该程序的结构就构成一个循环,每次循环对一个运算符及相应的操作数执行一次
操作:
while (下一个运算符或操作数不是文件结束指示符) if (是数)
将该数压入到栈中else if (是运算符) 弹出所需数目的操作数执行运算
将结果压入到栈中else if (是换行符) 弹出并打印栈顶的值else
出错
栈的压入与弹出操作比较简单,但是,如果把错误检测与恢复操作都加进来,该程序就
显得很长了,最好把它们设计成独立的函数,而不要把它们作为程序中重复的代码段使用。另外还需要一个单独的函数来取下一个输入运算符或操作数。
到目前为止,我们还没有讨论设计中的一个重要问题:把栈放在哪儿?也就是说,哪些 例程可以直接访问它?一种可能是把它放在主函数main中,把栈及其当前位置作为参数传递
给对它执行压入或弹出操作的函数。但是,main函数不需要了解控制栈的变量信息,它只进
行压入与弹出操作。因此,可以把栈及相关信息放在外部变量中,并只供push 与pop 函数
访问,而不能被main函数访问。
把上面这段话转换成代码很容易。如果把该程序放在一个源文件中,程序可能类似于下列形式:
#include... /* 一些包含头文件*/ #define... /* 一些define定义*/ main使用的函数声明
main() { ... }
push与pop所使用的外部变量
void push( double f) { ... }
double pop(void) { ... }
int getop(char s[]) { ... }
被getop调用的函数
我们在后面部分将讨论如何把该程序分割成两个或多个源文件。
main函数包括一个很大的switch循环,该循环根据运算
您可能关注的文档
最近下载
- 2025光伏行业产能过剩内卷竞争现状及未来展望分析报告.pdf
- 中建设计常规做法及指标汇编(2022年,934页).pdf VIP
- 2025年国庆节假期安全教育PPT课件.pptx VIP
- 医疗器械唯一标识管理制度(UDI).docx VIP
- 《成人腰大池引流护理》(TCRHA 069-2024).pdf VIP
- 营销策划 -MINI品牌中国小红书内容种草策略分享-运营思路V2-小红书汽车.pdf
- 中小学生世界粮食日节约粮食主题班会PPT课件.pptx VIP
- 幼儿园保育技能基本功大赛试题.docx VIP
- 土木工程材料1.2 材料与水有关的性质XQ.ppt VIP
- 剑桥KET2025最新考试真题(标准真题版TEST3-阅读和写作部分-含答案及详细解析).pdf VIP
文档评论(0)