函数|学习笔记

简介: 快速学习函数

开发者学堂课程【你的第一门 C 语言课:函数】学习笔记,与课程紧密联系,让用户快速学习知识

课程地址:https://developer.aliyun.com/learning/course/444/detail/5478


函数


内容介绍:

一、开发中遇到的问题

二、函数的定义

三、函数的声明

四、函数的参数和返回值


一、目前我们在开发中遇到的问题

随着程序规模的变大

- main 函数变得相当冗杂因为将所有代码量三百行代码都扔到 main 函数里

-程序复杂度不断提高

-代码前后关联度高,修改代码往往牵一发而动全身比如说在最上面的位置修改了变量的命名,在下面的代码就要修改好几十处

-变量的命名都成了问题因为简单的名字都用完了,比如小明、小红、阿黄这些名字都用过了,所以只能用小明1号、小明2号这种名字

-为了在程序中多次实现某功能,不得不重复多次写相同的代码

讲解主题就是为了解决上面的这些痛点,函数从第一个程序开始就一直在用,在屏幕上打印 hello world 字符串的时候,使用的是 printf 函数,这是一个标准库的函数,是 c 语言为我们提供的,有了它就可以在屏幕上输出格式化的内容。

C 语言的标准库还提供了很多各种其他功能的函数,有处理字符串的要引入 string的头文件、有数学计算要引个 math 的头文件,有输出输入就是 printf、scanf 之类的,还有进程管理有信号、有接口处理的。

有了这些函数,就不再需要去关注内部的实现细节,而只需要将注意力放在程序的实现逻辑上就可以了。

比如说要打印字符串到屏幕上,只需要知道调用 printf 函数,然后并给他传递我们要打印的字符串,要传递这个内容过去就可以了,至于他是如何做的细节不需要知道。

作为一门高级的编程语言,c 语言是支持我们自己来封装函数的。

当我们将代码段根据其功能封装为一个个不同的函数,往大了说这叫做模块化程序设计,往小处说实际上就是把大的计算部分分解成若干个小的任务来单独实现,就是把 main 函数拆开,根据功能划分成不同的段落,这就是函数、封装。

封装一个函数 print_ C调用它就可以打印。

#incLude

void print_C(); // 函数的声明

// 函数的定义

void print_C()

{

printf(" ##### \n") ;

printf("####\n");

printf("##\n");

printf("## \n");

printf("## \n");

printf("####\n") ;

printf(" ###### \n") ;

}

int main( )

{

print_C();// 调用函数

return 0;

}

使用这个程序:gcc test1.c && ./a.out

如果想要打印多个,就多次调用函数。

int main( )

{

print_C();// 调用函数

printf("\n");

print_C();

printf("\n");

print_C();

return 0;

}

使用这个程序:gcc test1.c && ./a.out

函数就是对多个代码段的封装,使用 print_C();就会执行很长一段代码。

 

二、函数的定义

类型名 函数名(参数列表)

{

函数体

}

类型名:函数的返回值,如果这个函数不准备返回任何数据,需要写上 void 表示不返回数据,void 是空类型、无类型。

函数名:指函数的名字,一般根据函数的实现功能来命名,比如说 print_C 就是打印 C。

参数列表:指定了参数的类型和名字,如果说这个函数没有参数,那么这个位置的直接写上小括号就可以了,但是不能什么都不写,就算没有参数也要写个小括号。

函数体:指的是函数的具体实现过程。

 

三、函数的声明

所谓声明( Declaration )就是告诉编译器我要使用这个函数,你现在没有找到它的定义不要紧,请不要报错,稍后我会把定义补上。

有时候就算不写函数声明程序也是可以正常执行的,但如果你把函数的定义写在函数之后呢,编译器就可能找不着北了。

#incLude

int main( )

{

print_C();// 调用函数

return 0;

} 

// 函数的定义

void print_C()

{

printf(" ##### \n") ;

printf("##    ##\n");

printf("##      \n");

printf("##     \n");

printf("##     \n");

printf("##    ##\n") ;

printf(" ###### \n") ;

}

编译器会提醒报错

因为调用 print_C();时,程序的流程是从上到下的,编译也是如此。

 

四、函数的参数和返回值

有时候函数需要接收用户传入的数据,那么就需要使用到函数的参数,这是灵活定制函数的一个方式,根据需求函数的参数的数量可以有多个,类型的也可以各不相同,而函数的返回值通常是反馈这个函数的计算结果,也可以用来表示函数的执行结果。

就函数执行成功返回 true,函数执行失败返回 false,C 语言只有布尔类型支持 true 和 false。

编写一个函数 sum,由用户输入参数 n,计算1+2+3+.。.+(n-1)+n的结果并返回。

#incLude

int sum(int n);// 函数的声明

Int sum(int n)// 函数的定义,也说明了参数的类型,形参

{

int result = 0;

do

{

result += n;

} while(n-- > 0) ;

return result;

}

int main( )

{

int n, result;

printf("请输入n的值: ");

scanf("%d", &n) ;

result = sum(n) ;// 调用的参数为实参

printf("1+2+3+...+(n-1)+n的结果是: %d\n", sum(n));

return 0 ;

}

使用这个程序:gcc test2.c && ./a.out

编写一个函数 max,接收两个整型参数,并返回它们中的较大的值。

#incLude

int max(int, int);// 函数的声明,可以不写名字但一定要写类型

int max(int x, int y)// 函数的定义

{

if (x>y)

return X ;

else

return y ;

}

int main()

{

int a,b,c;

printf("请输入两个整数:“);

scanf ("%d%d '&a,&b);

c = max(a, b);

printf("它们中较大的值是: %d\n", c);

return 0 ;

}

使用这个程序:gcc test3.c && ./a.out

这里有两个 return,但不代表有两个返回值,函数一旦遇到 return 语句就会立即返回。

if (x>y)

return X ;

else

return y ;

printf("小甲鱼你好帅啊!\n")

printf 语句不会被执行,因为这个程序在遇到 return 语句的时候直接返回值,不会再往下执行。

相关文章
|
物联网 Linux 开发者
Sigfillset 函数|学习笔记
快速学习 Sigfillset 函数
1002 0
|
程序员
【学习笔记之我要C】函数
【学习笔记之我要C】函数
169 0
|
PHP 开发者
函数基本应用|学习笔记
快速学习函数基本应用
85 0
函数基本应用|学习笔记
|
PHP 开发者
认识函数|学习笔记
快速学习认识函数
57 0
认识函数|学习笔记
|
物联网 Linux C语言
Execvp 函数|学习笔记
快速学习 Execvp 函数
574 0
Execvp 函数|学习笔记
|
物联网 Linux C语言
Execv 函数|学习笔记
快速学习 Execv 函数
267 0
Execv 函数|学习笔记
|
物联网 Linux 开发者
Sigprocmask 函数|学习笔记
快速学习 Sigprocmask 函数
704 0
Sigprocmask 函数|学习笔记
|
物联网 Linux C语言
Execle 函数|学习笔记
快速学习 Execle 函数
153 0
Execle 函数|学习笔记
|
物联网 Linux C语言
Execlp 函数|学习笔记
快速学习 Execlp 函数
155 0
Execlp 函数|学习笔记
|
人工智能 vr&ar 开发者
函数 | 学习笔记
快速学习函数
72 0
函数  |  学习笔记