函数的定义和调用

什么是函数?

  • 函数是一块代码,接收零个或多个参数, 做一件事情,并返回零个或一个值 0
  • 可以先想像成数学中的函数:

    • Y=f(x)

从函数中返回

调用函数

  • 函数名(参数值);
  • ()起到了表示函数调用的重要作用

    • 即使没有参数也需要()
  • 如果有参数,则需要给出正确的数量和顺序
  • 这些值会被按照顺序依次用来初始化函数 中的参数
  • ,如果函数有参数,调用函数时必须传递给它数量, 类型正确的值
  • 可以传递给函数的值是表达式的结果,这包括:

    • 字面量
    • 变量
    • 函数的返回值
    • 计算的结果

类型不匹配?

  • 调用函数时给的值与参数的类型不匹配是C语言传统 上最大的漏洞
  • 编译器总是悄悄替你把类型转换好,但是这很可能不 是你所期望的
  • 后续的语言,C++/Java在这方面很严格

参数传递

传值

  • 每个函数有自己的变量空间,参数也位于这个独立的空间中,和其他函数没有关系
  • 过去,对于函数参数表中的参数,叫做“形式参 数”,调用函数时给的值,叫做“实际参数”
  • 由于容易让初学者误会实际参数就是实际在函数 中进行计算的参数,误会调用函数的时候把变量 而不是值传进去了,所以我们不建议继续用这种 古老的方式来称呼它们

本地变量

  • 函数的每次运行,就产生了一个独立的变量空间,在 这个空间中的变量,是函数的这次运行所独有的,称 作本地变量
  • 定义在函数内部的变量就是本地变量 •
  • 参数也是本地变量

变量的生存期和作用域

  • 生存期:什么时候这个变量开始出现了,到什么时候 它消亡了
  • 作用域:在(代码的)什么范围内可以访问这个变量 (这个变量可以起作用)
  • 对于本地变量,这两个问题的答案是统一的:大括号 内——块

本地变量的规则

  • 本地变量是定义在块内的 •
  • 它可以是定义在函数的块内
  • 也可以定义在语句的块内
  • 甚至可以随便拉一对大括号来定义变量 程序运行进入这个块之前,其中的变量不存在,离开这个块,其中的变量 就消失了
  • 块外面定义的变量在里面仍然有效
  • 块里面定义了和外面同名的变量则掩盖了外面的
  • 不能在一个块内定义同名的变量
  • 本地变量不会被默认初始化
  • 参数在进入函数的时候被初始化了

函数其他细节

没有参数时

  • void f(void);
  • 还是 a void f();

    • 在传统C中,它表示f函数的参数表未知,并不表示 没有参数

逗号运算符?

  • 调用函数时的逗号和逗号运算符怎么区分?
  • 调用函数时的圆括号里的逗号是标点符号,不是运算 符
  • f(a,b)
  • f((a,b))

函数里的函数?

  • C语言不允许函数嵌套定义

关于main

  • int main()也是一个函数
  • 要不要写成int main(void)?
  • return的0有人看吗?
  • Windows: if error level 1 ...
  • Unix Bash: echo$?$
  • Csh:echo • Csh: echo$status

参考资料

程序设计入门——C语言\_浙江大学\_中国大学MOOC(慕课) (icourse163.org)

最后修改:2023 年 10 月 21 日
如果觉得我的文章对你有用,请随意赞赏