函数名的可见性

在介绍函数时,我们提到函数在被调用之前其名称必须是可见的。也就是说在编译时,被调用的函数签名是要存在的。而在连接时,函数体必须是定义完整的,只有这样才可以生成最终的可执行程序。

在编译阶段,编译器从源代码第一行开始向后处理。当在主程序中调用printfHello时,由于函数体已经由#1处定义,对于main函数而言,该名称printfHello是可见的,因此通过编译。printOk也能顺利编译,因为有函数声明在先,在链接时,链接器会找到printOk的实现,因此整个程序顺利编译连接完成。

你可以尝试注释掉printOk函数的实现,再点击【生成】菜单下的【编译】命令,程序会编译成功。再点击【生成】菜单下的【生成 你的项目名称】命令,在输出窗口会看到如下的连接错误信息:error LNK2019: 无法解析的外部符号 _printOk,该符号在函数 _main 中被引用。 这说明没有找到printfOK函数的定义,至于为什么输出窗口的名称是_printfOk,我们以后会讲解。

由于printHello函数的存在,这可能给你造成一个错觉,看来根本不需要函数声明啊!多写一个麻烦又浪费。

是的,对于目前我们学习使用的这些小程序而言,把所有的函数直接定义在main函数之前是可行的。但试想一下,假定B函数调用A函数,这就要求A必须在B上面实现,A又调用C的话,C又必须编写在A的上面,这就相当于造成了手工负责函数定义顺序的问题,对于有成百上千个函数的程序而言,这无异于灾难。另一种情况是,当出现A需要调用B,B又需要调用A,这种你中有我我中有你的情况时,该怎么办?

另一方面,函数声明还是对外联系的说明书(接口)。所以说,在你尝试自己写一个有意义的“大项目”时,老老实实的写下函数声明,会减轻很多维护负担。

变量的可见性

一个变量的名称在一定范围内必须是唯一的,这个范围可以称为限定域,一对大括号可以形成一个域。函数体自身由大括号构成包围,这就表明函数体自身就是一个限定域,函数体内声名的变量名称属于该函数体,不同的函数声明的同名变量互不影响。由下面的程序可以看出,变量名称a在不同的域中被多次使用,正是因为它们处于不同的域,所以互不影响,不会产生错误。

变量隐藏

在程序中,能在一组大括号中定义变量的区域,都会形成一个名称限定域。如我们已经学过的if/for/while语句。上面的示例程序中,在函数体内我们使用一个独立的大括号也形成了一个名称限定或,其目的只是演示一下域的概念,这个技巧更多的适用于具有面向对象特性的语言,如C++等。

如果一个名称限定域包含多个子域,如域A包含域B,假设被包含的域B声明的变量与外围域A某变量名称相同,表示外围域的变量名被隐藏,此变量将不可访问,其它未隐藏的变量在当前域仍可访问。

函数参数可见性

函数参数属于整个函数体,函数体自身又是一个域,因此该变量在函数体中不同的域都可以被访问到,同样它也遵循变量隐藏机制。

程序使用#num的形式表示了函数体内存在的域。在if语句中使用了自身域内新定义的变量times,其它域则使用了传入的变量times,该变量属于整个函数体。最后,假定我们调用printOk进传递了参数3,尝试一下说出程序运行结果,验证一下对于域的理解,下篇见。

sql语言快速入门_C语言快速入门——名称可见性相关推荐

  1. c语言圆周率计算_C语言入门这一篇就够了

    c语言入门 C语言一经出现就以其功能丰富.表达能力强.灵活方便.应用面广等特点迅速在全世界普及和推广.C语言不但执行效率高而且可移植性好,可以用来开发应用软件.驱动.操作系统等.C语言也是其它众多高级 ...

  2. 【C语言 MOOC】程序设计入门_C语言(翁恺)

    文章目录 程序设计入门-C语言(MOOC-翁恺) Week 1 程序设计与C语言 lesson 1 计算机和编程语言 辗转相除法 程序的执行 lesson 2 第一个程序 Week 2 计算 less ...

  3. PIC单片机入门_C语言编程技术

    1.为什么也是C语言? 用C 语言来开发单片机系统软件最大的好处是编写代码效率高.软件调试直观.维护升级方便.代码的重复利用率高等,因此C 语言编程在单片机系统设计中越来越广泛的运用.PIC 单片机的 ...

  4. java和c语言的区别_C语言为何不会过时?你需要掌握多少种语言?

    关注.星标公众号,不错过精彩内容 整理/排版:付斌 转自:嵌入式ARM 01 为什么C语言不会过时 评价任何一门编程语言,都是招人骂的.永远是这样.就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过 ...

  5. window直接运行不需要环境的软件是什么语言开发的_C语言为何不会过时?你需要掌握多少种语言?_C 语言...

    01为什么C语言不会过时 评价任何一门编程语言,都是招人骂的.永远是这样.就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过,双方一定是同时在心里出现了两个字:"s b!"这个在 ...

  6. java c语言与人工智能_C语言与LISP语言的区别

    C语言:C是过程式编程语言.它被设计成使用编译器编译.该语言有少量固定数量的关键字,如if/else,for,while,..等等.我们可以使用一个以上的作业,可以用这种语言在一个语句中使用.函数也在 ...

  7. c语言求素数_C语言 | 求100~200的素数

    "要成为绝世高手,并非一朝一夕,除非是天生武学奇才,但是这种人-万中无一" --包租婆这道理放在C语言学习上也一并受用.在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从C语 ...

  8. c语言实现通讯录_C语言实现双人猜数字游戏

    点击上方"学士科技",选择"设为星标" 资讯.技术干货第一时间送达! C语言合集(基础.进阶.高级)通通有,点我点我      C语言实例 01.C语言编写简单 ...

  9. c语言c99标准_C语言的三套标准:C89、C99和C11

    我们今天使用的 Windows.Linux.Mac OS 等操作系统都是由一种叫做 Unix 的系统演化而来.Unix 作为80年代主流的操作系统,是整个软件工业的基础,是现代操作系统的开山鼻祖,C语 ...

  10. c语言学生综合测评系统_c语言图书管理系统_c语言学生综合测评系统_c语言个人账本管理系统...

    c语言销售管理系统设计 c语言设计管理系统,c图书管理系统设计,学生管理系统c语言,职工管理系统c语言,c语言图书管理系统,c语言成绩管理系统,c语言管理系统,c语言银行管理系统,c语言工资管理系统, ...

最新文章

  1. 眠眠interview Question
  2. 第二十七课.深度强化学习(二)
  3. JVM:查看java内存情况命令
  4. 常考数据结构与算法:括号序列
  5. json数据交换的例了
  6. arp协议的主要功能是_程序员需要掌握的一些网络协议汇总
  7. Material Design设计技巧
  8. echarts 不支持 手机 浏览器_中国北斗卫星导航系统真的来了!获国产手机力挺:但iPhone却不支持...
  9. 企业篇之员工工资管理系统(Java+SQL sever实现)
  10. 电脑面上,在电脑桌面上添加文字_在电脑桌面上添加图片
  11. 东南计算机专硕学硕区别,学硕VS专硕,你该如何选择?
  12. html怎么做出相框的效果,使用html5 svg和css3制作边框运动的动画效果
  13. 计算机相关的名词解释
  14. 理解IGRP协议-ielab
  15. 浅析AI边缘计算的车辆/车牌识别技术研发及场景应用
  16. react具名插槽与作用域插槽
  17. android涂鸦实现
  18. 你不可不用的十种Mac装机必备软件
  19. win10关闭自动更新(针对已经关闭windows update项,但系统仍自动更新的问题)
  20. Cesium各类实体的添加

热门文章

  1. VIM学习网址和资料收集
  2. IE6绿色中文版,支持在Win7、Win8下完美运行
  3. 阅读verilog程序总结
  4. JAVA 设计模式 职责链模式
  5. 微软云计算介绍与实践(实践之三十五)
  6. 基于Ubuntu12.04下的Keystone源码安装
  7. C#: Writing a CookieContainer to Disk and Loading Back In For Use
  8. Linux操作系统中的文件管理技巧
  9. Import declarations are not supported by current JavaScript version
  10. JAVA深复制(深克隆)与浅复制(浅克隆)