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 <stdio.h>

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 <stdio.h>

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等文件)时使用。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,980评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,422评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,130评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,553评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,408评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,326评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,720评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,373评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,678评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,722评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,486评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,335评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,738评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,283评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,692评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,893评论 2 335

推荐阅读更多精彩内容

  • 一. 函数的三要素 1. 函数的声明 2. 函数的返回值 3. 函数体 Eg: int sumf(int a , ...
    CarsonChen阅读 403评论 0 0
  • 函数: 如何定义函数:[ 一个程序必须有且只能存在一个主函数 ] 主函数可以调用普通函数 普通函数不能调用主函数 ...
    深藍碎片_阅读 442评论 0 0
  • 一. 函数指针的定义 1. 函数的作用:完成某一特定功能的代码片段的封装. 2. 函数的定义: 返回值类型,函数名...
    CarsonChen阅读 422评论 0 0
  • 函数定义 C语言程序框架C语言程序的框架有两种: 注意:1.一个源程序文件可由一个或多个函数组成之函数2.一个C语...
    keeeeeenon阅读 728评论 0 3
  • 1一个函数仅完成一件功能 2重复代码应该尽可能提炼成函数 3避免函数过长新增函数尽量不超过50行非空非注释行 4避...
    枫馨蕊阅读 972评论 0 0