C语言之函数

函数的意义

  1. 函数解决了代码段复用的问题:相同功能的代码段可以直接重复使用,相似的或者仅仅是某个参数不同的,可以用带参数的函数解决。
  2. 函数减少了代码的总长度,因为重复的只出现一次。
  3. 函数让主调用代码或主调用函数的结构更加清晰。
  4. 当软件开发是多个人时,相互之间可以通过函数调用提高开发效率。

函数的定义和使用

函数是一块代码,接受零个多个参数,做一件事情,并返回零个一个值。

函数的定义

<返回类型> 函数名称([<参数类型> 参数名称, ...]) // 函数头:返回值类型,函数名称,参数表
{
  函数体
}

注意

  1. 没有返回值的函数
  • 函数没有返回值,使用void进行标识;即void 函数名(参数列表)
  • 不能使用带值的return,也可以没有return语句
  • 调用没有返回值的函数时,不能进行赋值操作

2.有返回值的函数

  • 函数体内必须有带值的return语句

函数调用

函数名称(函数的yi参数表);

注意

  • 调用函数时,()起到了表示函数调用的重要作用,即使没有参数也需要()
  • 函数如果有参数,调用时,需要给出正确的数量和顺序。
  • 当函数有返回值时,return为函数返回标记,return关键字停止函数的执行,并返回一个值。
  • 一个函数中可以出现多个return语句

函数的参数和变量

函数的原型

对于C语言编译器来说是自上而下顺序分析程序猿编写的代码,因此函数有先后关系。
在进行函数调用时,必须要知道函数的基本信息:返回值、函数名称、参数个数、参数类型、参数顺序,为了解决这个问题,主要有两种方式:

  1. 函数定义在函数调用之前;
  2. 通过函数原型进行声明。

函数原型的语法:
使用函数头,并以分号;结尾,就构成了函数的原型

函数原型的目的:
告诉编译器函数的基本信息:名称、参数(数量及类型)、返回值类型

注意

  1. 函数调用时,会根据函数原型进行自动类型转换。
  2. 函数原型的位置建议放在头文件之后(也可以放在对应函数体内的首行,但是不推荐)。
  3. 函数原型中可以将函数参数名省略掉,但是为了程序的可读性,建议函数声明与函数定义时的函数头保持一致。

参数传递

如果函数有参数,进行函数调用时必须传递给它数量、类型正确的值(实参)。
值(实参)的类型有:

  1. 字面量
  2. 变量
  3. 函数的返回值
  4. 计算的结果
  • 当传递的参数的类型不匹配时,将怎么办?
    调用函数时给的值与参数的类型不匹配是C语言传统的漏洞,C语言的编译器总是会进行自动类型转换,以至于最终的结果往往不符合预期。

  • 函数调用时,传递过去的内容是什么?
    C语言在调用函数时,传递的内容是值。
    传值过程中,有如下注意事项:

  1. 每个函数都有自己的变量空间,参数(形参)也位于这个独立的空间中,和其他函数没有关系。
  2. 形式参数(参数);实际参数(值)

本地变量

函数的每次运行会产生一个独立的变量空间,在这个空间中的变量,是函数的这次运行独有的,称作本地变量。函数中的参数也是本地变量。
本地变量的性质:

  • 生存期:什么时候这个变量开始出现了,到什么时候它消亡了。
  • 作用域:在代码的什么范围内可以访问这个变量(这个变量可以起作用)
    区分规则:大括号{}——块

本地变量的规则:

  • 本地变量是定义在块内的
    定义在函数的块内
    定义在语句的块内
    定义在某一对大括号内
  • 程序运行进入这个块之前,其中的变量不存在,离开这个块后就消失了
  • 块外面定义的变量在块内仍然有效
  • 块内定义的变量覆盖了块外同名的变量
  • 不能在同一个块内定同名的变量
  • 本地变量不会默认初始化

函数小细节

没有参数的函数

定义没有参数的函数时,使用如下:

// 函数声明
<返回值类型> 函数名称(void);
// 函数定义
<返回值类型> 函数名称(void) {
  函数体
}

<返回值类型> 函数名称();参数列表位置表什么也没有写,它表示参数的参数表未知,并不表示没有参数。

#include 

void print(int a, int b);

int main() 
{
    int a, b;
    a = 5;
    b = 6;
    print(a, b); // 正常输出:第一个参数:5, 第二个参数:6
    return 0;
} 

void print(int a, int b)
{
    printf("第一个参数:%d, 第二个参数:%d\n", a, b);
}

进行如下修改:

#include 

void print();

int main() 
{
    int a, b;
    a = 5;
    b = 6;
    print(a, b); // 编译时报错或运行时出现bug
    return 0;
} 

void print(double a, double b)
{
    printf("第一个参数:%lf, 第二个参数:%lf\n", a, b);
}

部分编译器直接报错,部分编译器将能够运行,但是运行结果错误,出现bug

逗号运算符 VS 函数调用时的逗号

  • 函数调用时的逗号表示标点符号
  • 逗号运算符表示一个运算符

函数里的函数

C语言中不允许函数嵌套定义,但是可以进行在某个函数内进行函数声明。

关于main函数

C语言中main()函数是程序的入口函数,这个是针对程序猿来说的。对于整个程序来说,main函数不是程序运行的首条指令。
main函数中的return信息是有效的,返回0表示正常结束;返回非0表示异常结束。main函数的return信息是在编写批处理文件(如.sh,.bat等文件)时使用。

你可能感兴趣的:(C语言之函数)