学习目标
u 了解函数的定义与声明
u 掌握函数的调用方式
u 掌握外部函数与内部函数
u 掌握局部变量与全局变量
在前面的章节中已经接触过一些简单的函数,如程序的主函数main()、标准输出函数printf()。在C语言中,大多数功能都是依靠函数来实现的。本章将针对函数的定义、内部函数与外部函数等相关知识进行详细地讲解。
4.1 初识函数
假设有一个游戏程序,程序在运行过程中,要不断地发射炮弹。发射炮弹的动作需要编写100行的代码,在每次实现发射炮弹的地方都需要重复地编写这100行代码,这样程序会变得很臃肿,可读性也非常差。为了解决代码重复编写的问题,可以将发射炮弹的代码提取出来放在一个{}中,并为这段代码起个名字,这样在每次发射炮弹的地方通过这个名字来调用发射炮弹的代码就可以了。上述过程中,所提取出来的代码可以被看作是程序中定义的一个函数,程序在需要发射炮弹的地方调用该函数即可。
在C语言中,定义一个函数的具体语法格式如下:
返回值类型 函数名([[参数类型 参数名1],[参数类型 参数名2],……,[参数类型 参数n]])
{
执行语句
………
return 返回值;
}
为了让读者更好地理解函数的各个组成部分,接下来对上述语法格式进行简要说明,具体如下:
l 返回值类型:用于限定函数返回值的数据类型;
l 函数名:表示函数的名称,该名称可以根据标识符命名规范来定义;
l 参数类型:用于限定调用方法时传入参数的数据类型;
l 参数名:用于接收调用方法时传入的数据;
l return关键字:用于结束函数,并返回函数指定类型的值;
l 返回值:被return语句返回的值,该值会返回给调用者。如果函数没有返回值,则返回值类型要声明为void,此时,函数体中的return语句可以省略不写。
在上面的语法格式中,函数中的“[[参数类型 参数名1],[参数类型 参数名2],…,[参数类型 参数n]]”被称作参数列表,它用于描述函数在被调用时需要接收的参数。如果函数不需要接收任何参数,则参数列表为空,这样的函数被称为无参函数。相反地,参数列表不为空的函数就是有参函数。接下来分别讲解这两种函数。
1、无参函数
在C语言中,无参函数的定义很简单,先来看一个定义无参函数的示例代码,具体如下:
void func()
{
printf("这是我的第一个函数!\n");
}
上述示例代码中,func()函数就是一个无参函数,在定义时参数列表为空。要想执行这个函数,需要在main()函数中调用它,接下来通过一个案例来演示,如例4-1所示。
例4-1
1 #include <stdio.h>
2 void func()
3 {
4 printf("这是我的第一个函数!\n");
5 }
6 void main()
7 {
8 func();
9 }
运行结果如图4-1所示。
图4-1 运行结果
从图4-1中可以看出,func()函数被成功调用了。在程序中,第2行代码定义了一个无参函数func(),第4行代码将字符串打印到控制台,第8行代码在main()函数中调用该无参函数。
下面通过一张流程图来说明上面例子中函数的调用过程,具体如图4-2所示。
图4-2 主函数中调用子函数func()的流程图
从图4-2可以看出程序是由上至下按顺序执行的,程序首先从主函数开始执行,遇到“func();”语句后跳转到func()函数,执行func()函数体。执行完func()函数后返回到原来的调用点(即“func()”语句),接着执行调用点后面的其他语句,如果后面没有其他语句,则主函数执行结束。
2、有参函数
与无参函数相比,有参函数需要在函数定义时,在函数名称后面的括号中填写参数。所谓的参数是一个变量,用于接收调用函数传入的数据。定义有参函数的示例代码如下:
void func(int x,int y)
{
int sum=x+y;
printf("x+y=%d\n",sum);
}
上述代码中,定义了一个实现加法运算的函数func(),并指定了两个int类型的参数。为了让读者更好地掌握有参函数的用法,接下来在main()函数中调用func(int x,int y)函数,如例4-2所示。
例4-2
1 #include <stdio.h>
10 void func(int x, int y)
11 {
12 int sum = x + y;
13 printf("x+y=%d\n", sum);
14 }
15 void main()
16 {
17 func(3, 5);
18 }
运行结果如图4-3所示。
图4-3 运行结果
在例4-2中,第2~6行代码定义了一个函数func(),该函数包含两个参数,分别是x和y。当在main()函数中调用func()函数时,由于传入的参数是3和5,因此,程序打印的结果为“x+y=8”。下面通过一张图来描述func()函数的调用过程,具体如图4-4所示。
图4-4 主函数中调用子函数func()的流程图
从图4-4可以看出,有参函数和无参函数的调用过程类似,只不过在调用有参函数时,需要传入实参,并将传入的实参赋值给形参,然后在函数体中执行x+y操作,最终将结果输出到控制台。
值得一提的是,在定义有参函数时指定的参数x和y是形式参数,简称形参,它们只在形式上存在,并不是真正存在的参数。调用函数时传入的参数(如案例中的3和5)是实际参数,简称实参,与形参相对,实参则是指实际存在的参数。
通过前面的讲解可知,函数的返回值是指函数被调用之后,返回给调用者的值。函数返回值的具体语法格式如下:
return 表达式;
对于返回值为空的函数,可以直接在return语句后面加分号,具体语法格式如下:
return;
为了让读者更好的学习如何使用return语句,接下来对例4-2进行改写,使func(int x, int y)函数能够返回求和计算的结果,修改后的具体代码如例4-3所示。
例4-3
1 #include <stdio.h>
19 int func(int x, int y)
20 {
21 int sum = x + y;
22 return sum;
23 }
24 void main()
25 {
26 int sum = func(3, 5);
27 printf("x+y=%d\n", sum);
28 }
运行结果如图4-5所示。
图4-5 运行结果
从图4-5中可以看出,例4-3与例4-2实现了同样的功能。接下来通过一个图例来演示func()函数的整个调用过程以及return语句的返回过程,如图4-6所示。
图4-6 func()函数的调用过程
从图4-6可以看出,在程序运行期间,参数x和y相当于在内存中定义的两个变量。当调用func(int x,int y)函数时,传入的参数3和5分别赋值给变量x和y,并将x+y的结果通过return语句返回,整个方法的调用过程结束,变量x和y被释放。
需要注意的是,return后面表达式的类型和函数定义返回值的类型应保持一致。如果不一致,就有可能会报错。如果函数没有返回值,返回值类型要声明为void。为保证程序的可读性和逻辑性,没有返回值的函数都应定义为void。
在C语言开发中,经常会进行一些输入输出操作,为此,C语言提供了printf()和scanf()函数,其中,printf()函数用于向控制台输出字符,scanf()函数用于读取用户的输入,下列将分别讲解这两个函数的用法。
1、printf()函数
在前面的章节中,经常使用printf()函数输出数据,它可以通过格式控制字符输出多个任意类型的数据。表4-1列举了printf()函数中常用的格式控制字符。
表4-1 常用printf()格式字符
常用格式字符 |
含义 |
%s |
输出一个字符串 |
%c |
输出一个字符 |
%d |
以十进制输出一个有符号整型 |
%u |
以十进制输出一个无符号整型 |
%o |
以八进制输出一个整数 |
%x |
以十六进制输出一个小写整数 |
%X |
以十六进制输出一个大写整数 |
%f |
以十进制输出一个浮点数 |
%e |
以科学计数法输出一个小写浮点数 |
%E |
以科学计数法输出一个大写浮点数 |
表4-1中列举了很多格式控制字符,使用这些格式控制符可以让printf()输出指定类型的数据,接下来通过一个具体的案例来演示这些格式控制符的使用,如例4-4所示。
例4-4
1 #include <stdio.h>
29 void main()
30 {
31 printf("%c %c", ‘H‘, ‘\n‘);
32 printf("%s", "Hello, world!\n");
33 printf("%d %d %d \n", 1, 2, 3);
34 printf("%f %f \n", 2.1, 2.2);
35 }
运行结果如图4-7所示。
图4-7 运行结果
在例4-4的printf()函数中,通过格式控制字符“%c”、“%s”、“%d”、“%f”,分别输出了字符、字符串、整数、浮点数。
2、scanf()函数
scanf()函数负责从控制台上接收用户的输入,它可以灵活接收各种类型的数据,如字符串、字符、整型、浮点数等,scanf()函数也可以通过格式控制字符控制用户的输入,其用法与printf()函数一样。接下来,通过一个获取字符串的案例讲解scanf()函数的用法,如例4-5所示。
例4-5
1 #include <stdio.h>
36 void main()
37 {
38 char str[256]; // 字符数组保存得到的字符串
39 scanf("%s", str);
40 printf("%s\n", str);
41 }
运行结果如图4-8所示。
图4-8 运行结果
在例4-5中,首先定义了一个长度为256的字符数组str,然后利用scanf()函数获得用户从控制台输入的字符,最后使用printf()函数将得到的字符串打印在控制台上。本例中用户从控制台上输入了Helloworld,并按回车符,此时scanf()函数会把回车符看做是字符串终止的标志(也称为终止符),将整个Helloworld读取到str字符数组中。
M脚下留心:C语言中的终止符
在使用scanf()函数获取用户输入的信息时,如果输入的信息中包含某个终止符,scanf()函数就认为输入结束,接下来就列举一些常见的终止符,具体如表4-2所示。
表4-2 scanf()输入字符串的终止符
字符 |
含义 |
0x20 |
空格 |
\t |
水平制表符(tab键) |
\n |
换行 |
\v |
垂直制表符 |
\f |
换页 |
\r |
回车 |
接下来,以例4-5为例,当程序运行后,如果输入的字符串包含空格,例如“Hello world”,此时程序的运行结果如图4-9所示。
图4-9 运行结果
从图4-9可以看出,尽管输入的字符串是Hello world,但是程序只打印了Hello。这是因为Hello world中包含一个空格,空格也是一个终止符,因此scanf()只能读到空格之前的内容。
4.2 函数调用
在C语言中,一个完整的应用程序不可能在一个函数中实现所有的功能。通常程序都是由若干功能不同的函数功能来实现,并且函数之间会存在互相调用的情况。本节将针对函数的调用方式、嵌套调用以及递归调用进行详细地讲解。
函数是C语言的基本组成元素,要想实现函数的功能,必须学会正确调用函数。在C语言中,调用函数的具体语法格式如下:
函数名([[实参列表1],[实参列表2],...])
从上面的语法格式可以看出,当调用一个函数时,需要明确函数名和实参列表。实参列表中的参数可以是常量、变量、表达式或者空,各参数之间使用英文逗号分隔。
根据函数在程序中出现的位置,可以有下列三种函数调用方式:
1、将函数作为表达式调用
将函数作为表达式调用时,函数的返回值参与表达式的运算,此时要求函数必须有返回值。示例代码如下所示:
int ret1 = max(100, 150);
2、将函数作为语句调用
函数以语句的形式出现时,可以将函数作为一条语句进行调用。示例代码如下所示:
printf("Hello, world!\n");
3、将函数作为实参调用
将函数作为另一个函数的实参时,要求该函数有返回值。示例代码如下所示:
printf("%d\n", max(100, 150));
在上面的语句中,将函数max()的返回值作为printf()函数的实参来使用。
C语言中函数的定义是独立的,即一个函数不能定义在另一个函数内部。但在调用函数时,可以在一个函数中调用另一个函数,这就是函数的嵌套调用。接下来通过一个案例来演示函数的嵌套调用,如例4-6所示。
例4-6
1 #include <stdio.h>
42 int max2(int a, int b) // 用于比较两个整数大小的函数
43 {
44 if (a > b){
45 return a;
46 }
47 else
48 {
49 return b;
50 }
51 }
52 int max4(int a, int b, int c, int d) // 用于比较四个整数大小的函数
53 {
54 int res;
55 res = max2(a, b);
56 res = max2(res, c);
57 res = max2(res, d);
58 return res;
59 }
60 void main()
61 {
62 int a, b, c, d, max;
63 printf("请输入四个整数:");
64 scanf("%d %d %d %d", &a, &b, &c, &d);
65 max = max4(a, b, c, d);
66 printf("max=%d \n", max);
67 }
运行结果如图4-10所示。
图4-10 运行结果
在例4-6中,main()函数中调用了max4()函数,max4()函数中又调用了max2()函数。为了帮助大家更好地理解执行流程,接下来通过一张图来描述,如图4-11所示。
图4-11 函数嵌套调用的执行流程图
图4-11展示了程序中含有三层函数调用嵌套的情形,总共分为9个步骤,具体如下:
(1) 执行main()函数的开头部分;
(2) 遇到函数调用语句,调用max4()函数,流程转向max4()函数入口;
(3) 执行max4()函数的开头部分;
(4) 遇到函数调用语句,调用max2()函数,流程转向max2()函数入口;
(5) 执行max2()函数,如果再无其他嵌套的函数,则完成max2()函数的全部操作;
(6) 返回到max2()函数中调用max4函数的位置;
(7) 继续执行max4()函数中尚未执行的部分,直到max4()函数结束;
(8) 返回main()函数中调用max4()函数的位置;
(9) 继续执行main()函数的剩余部分直到结束。
&多学一招:函数调用时最多可以嵌套多少层?
大家肯定会问:“既然函数嵌套调用和普通的调用看上去没什么区别,那是不是可以进行无限层的函数嵌套调用呢?”很遗憾,函数可以嵌套调用多少层是由程序运行时一个名为“栈”的数据结构决定的。一般而言,Windows上程序的默认栈大小大约为8 KB,每一次函数调用至少占用8个字节,因此粗略计算下,函数调用只能嵌套大约一千层,如果嵌套调用的函数里包含许多变量和参数,实际值要远远小于这个数目。
当然,单纯手动书写代码写出一千层嵌套函数调用基本是不可能的,但是一种名为“递归”的方法可以轻松达到这个上限。
在数学运算中,会遇到计算多个连续自然数之间的和的情况。例如要计算1~n之间自然数之和,就需要先计算1加2的结果,用这个结果加3再得到一个结果,用新得到的结果加4,以此类推,直到用1~(n-1)之间所有数的和加n。
在程序开发中,要想完成上述功能,就需要使用函数的递归调用,所谓的递归调用就是函数内部调用自身的过程。需要注意的是,递归必须要求有结束条件,不然就会陷入无限递归的状态,永远无法结束调用。接下来通过一个计算自然数之和的案例来学习递归调用,具体如例4-7所示。
例4-7
1 #include <stdio.h>
68 //下面的函数使用递归实现 求1~n的和
69 int getsum(int n)
70 {
71 if (n == 1)
72 {
73 return 1; //满足条件,递归结束
74 }
75 int temp = getsum(n - 1); //在函数体中调用自身
76 return temp + n;
77 }
78 void main()
79 {
80 int sum = getsum(4); //调用递归函数,获得1~4的和
81 printf("sum = %d\n",sum); //打印结果
82 }
运行结果如图4-12所示。
图4-12 运行结果
例4-7中,定义了一个getsum()函数用于计算1~n之间自然数之和。案例中的第9行代码相当于在getsum()函数的内部调用了自身,这就是函数的递归,整个递归过程在n==1时结束。由于函数的递归调用过程很复杂,接下来通过一个图例来分析整个调用过程,如图4-13所示。
图4-13 递归调用过程
图4-13描述了递归调用的过程,整个递归过程中getsum()函数被调用了4次,每次调用时,n的值都会递减。当n的值为1时,所有递归调用的函数都会以相反的顺序相继结束,所有的返回值会进行累加,最终得到的结果为10。
4.3 外部函数与内部函数
前面关于函数的调用都是针对同一个源文件中其他函数进行调用的,在有些情况下,函数也可能对另外一个源文件中函数进行调用。当一个程序由多个源文件组成时,根据函数能否被其他源文件调用,将函数分为内部函数和外部函数。本小节就围绕这两种函数的特点进行详细地讲解。
开发大型项目时,为了便于团队的协同工作,需要把一个项目拆分成很多源文件来分别实现,最终再把它们整合在一起。为了减少重复代码,一个源文件有时需要调用其他源文件中定义的函数。在C语言中,可以被其他源文件调用的函数称为外部函数,在调用外部函数之前,需要在当前源文件中定义外部函数。定义外部函数的方式是在函数的返回值类型前面添加extern关键字,示例代码如下:
extern int add(int x,int y);
在上述示例代码中,编译器会通过extern关键字知道add()函数是定义在其他文件中的外部函数。
为了帮助大家掌握外部函数的用法,接下来,在first.c文件中定义一个add()函数,然后在second.c文件中使用first.c文件中定义的add()函数,first.c和second.c的代码如例4-8、例4-9所示。
例4-8 first.c
1 int add(int x,int y)
83 {
84 return x+y;
85 }
例4-9 second.c
1 #include<stdio.h>
2 extern int add(int x,int y);
3 void main()
4 {
5 printf("%d",add(1,2));
6 }
运行结果如图4-14所示。
图4-14 运行结果
在例4-9中,second.c文件通过调用first.c中定义的add()函数计算出1加2的结果。second.c文件中的外部函数add()是在first.c文件中实现的,编译器从first.c中找到了该函数,并将它的作用域扩大到second.c文件中,于是second.c文件中也可以调用这个first.c中定义的add()函数,从而完成计算。
为简化编程,C语言中允许在定义外部函数时省略关键字extern。例4-8中定义的外部函数add()也可以修改为下面的代码:
int add(int x,int y);
上述代码由函数的返回类型、函数名和参数列表组成,这类格式的代码被称为函数原型。当代码中包含函数原型时,可能会有下列两种情况:
1、程序员希望编译器自动从其他文件中查找该函数的定义。
2、程序员先定义未实现的空函数,然后在其他文件中具体实现。
接下来就来看一下printf()函数的原型写法,具体代码如下:
int printf(const char *,…);
当在main()函数中定义了printf()函数的原型后再调用时就可以不用包含头文件<stdio.h>,如例4-10所示。
例4-10
1 int printf(const char *,…);
86 void main()
87 {
88 printf("调用printf()函数\n");
89 }
运行结果如图4-15所示。
图4-15 运行结果
在例4-10中,并没有包含头文件stdio.h,但是在代码第1行中声明了printf()函数的原型,那么编译器将会根据该原型自动从其他文件中查找该函数的定义,并将该函数的作用域扩展到原型所在的文件中,因此在本文件中就可以调用printf()函数。
需要注意的是,在声明外部函数时,无论有或没有关键字extern,外部函数与原函数定义的返回值类型、函数名称和参数列表必须一致。
由上小节讲解的外部函数可知,只要声明一个函数原型就能够调用其他源文件中的函数。但是当多人参与开发一个项目时,很有可能会出现函数重名的情况,这样,不同源文件中重名的函数就会互相干扰。此时,就需要一些特殊函数,这些函数只在它的定义文件中有效,该类函数称为内部函数。
在定义内部函数时,需要在函数的返回值类型前面添加static关键字(又称为静态函数),示例代码如下:
static void show(int x)
{
printf("%d",x);
}
为了让读者熟悉内部函数的作用,接下来通过在两个源文件中定义同名的内部函数来演示内部函数的用法,具体如例4-11和例4-12所示。
例4-11 first.c
1 #include<stdio.h>
90 void show()
91 {
92 printf("%s \n","first.c" );
93 }
例4-12 second.c
1 #include<stdio.h>
94 static void show()
95 {
96 printf("%s \n","second.c");
97 }
98 void main()
99 {
100 show();
101 }
运行结果如图4-16所示。
图4-16 运行结果
在例4-11和例4-12中,都定义了一个函数show(),second.c文件中的函数是内部函数。从运行结果可以看出,first.c中的show()函数被调用成功了,因此说明内部函数只会被自身调用,不会受到其他文件中同名函数的影响。从图4-16中可以看出,second.c中的show()函数被调用了。
M脚下留心:
如果将second.c中修饰show()函数的关键字static去除,运行时程序会提示错误,如图4-17所示。
图4-17 编译错误
从图4-17的错误结果可以看出,如果outer.c中的show()函数不声明为内部函数,就会受到其他文件中的同名函数的干扰。
4.4 局部变量与全局变量
通过前面的学习,发现变量既可以定义在函数内,也可以定义在函数外。定义在不同位置的变量,其作用域也是不同的。C语言中的变量,按作用域范围可分为局部变量和全局变量,本节将针对它们进行详细地讲解。
局部变量就是在函数内部声明的变量,它只在本函数内有效,也就是说,只能在本函数内使用它。此外,局部变量只有当它所在的函数被调用时才会被使用,而当函数调用结束时局部变量就会失去作用。接下来通过一个案例来演示,如例4-13所示。
例4-13
1 #include<stdio.h>
102 void show()
103 {
104 int x = 0;
105 }
106 void main()
107 {
108 printf("x的值为:%d\n", x);
109 }
编译时会出现错误如图4-18所示。
图4-18 编译错误
例4-13中,在show()函数内部定义了一个变量x,这个变量是个局部变量,它只在show()函数中有效。第8行,main()函数试图输出x的值,由于x只在show()函数中有效,在main()函数中无效,所以编译器报告一条错误。
在所有函数外部定义的变量称为全局变量(包括main()函数),它不属于哪一个函数,而是属于源程序。因此全局变量可以为程序中的所有函数所共用。它的有效范围从定义处开始到源程序结束,如例4-14所示。
例4-14
1 #include <stdio.h>
110 int x = 123;
111 void show()
112 {
113 printf("show()函数中,x的值为:%d\n",x);
114 }
115 void main()
116 {
117 show();
118 printf("main()函数中,x的值为:%d\n", x);
119 }
运行结果如图4-19所示。
图4-19 运行结果
在例4-14中,定义了一个变量x,它是在所有函数的外部定义的,所以是全局变量。然后调用show()函数,输出全局变量x的值,由于全局变量可以为程序中的所有函数所共用。所以show()函数成功地输出了变量x的值123。当程序结束时,全局变量x也随之结束,系统释放掉它所占用的内存。
从上面的例子可以看出,全局变量不像局部变量那样属于某个函数的,而是属于整个程序,那么假如局部变量与全局变量的名字相同,会发生什么情况呢?接下来通过一个案例来演示,如例4-15所示。
例4-15
1 #include<stdio.h>
120 int x = 789;
121 void main()
122 {
123 int x = 123;
124 printf("x的值为:%d\n", x);
125 }
运行的结果如图4-20所示。
图4-20 运行结果
例4-15中,第5行代码定义了一个局部变量x屏蔽掉了第2行的全局变量x,因此输出的结果为123,而不是789。需要注意的是,当局部变量与全局变量重名时,全局变量会被屏蔽。
在前面介绍过变量需要先定义后使用,但这并不意味着在变量定义之后的语句中一定可以使用该变量。变量需要在它的作用范围内才可以被使用,这个作用范围称为变量的作用域。接下来通过一个案例来演示变量的作用域,如例4-16所示。
例4-16
1 #include<stdio.h>
126 int x=10;
127 void show()
128 {
129 int x=20;
130 printf("show()函数中,x的值为:%d\n",x);
131 }
132 void main()
133 {
134 int x=30;
135 printf("main()函数中,x的值为:%d\n",x);
136 show();
137 }
运行的结果如图4-21所示。
图4-21 运行结果
在例4-16中,首先定义一个全局变量x,值初始为10,作用域是代码第2行到第14行。然后定义了一个局部变量x,初始为20,作用域是代码第5行到第7行。最后定义了一个局部变量x,值初始为30,作用域是代码第10行到第14行。
从运行结果可以看出,main()函数输出x的值为30,说明在main()函数中屏蔽掉了全局变量x。show()函数输出x的值为20,说明在show()函数中屏蔽掉了全局变量x。
4.5 本章小结
本章主要讲解了C语言中的函数,包括函数的定义和声明、变量的作用域、局部变量、全局变量以及递归调用等。通过本章的学习,读者应该能够将实现特定功能的代码封装,并以函数名实参列表的形式进行调用,从而简化代码,使代码更易读。
4.6 习题
一、填空题
1、在C语言中,用于结束函数并返回函数值的是return 关键字。
2、根据函数的参数列表是否为空,可以将函数分为__有参_函数和__无参__函数。
3、C语言中负责从控制台上接收用户输入信息的函数是__scanf__。
4、函数内部调用自身的过程称为函数的___递归___调用。
5、C语言中的变量,按作用域范围不同可分为_全局_变量和_局部__变量。
二、判断题
1、递归调用时必须有结束条件,不然就会陷入无限递归的状态。( ? )
2、C语言中不允许嵌套调用函数。( × )
3、在定义函数时,必须要指定函数中的参数列表。( ? )
4、当函数没有返回值时,其返回值类型必须声明为void。( ? )
5、局部变量就是在函数内部声明的变量。( ? )
三、选择题
1、下列函数中,用于向控制台输出信息的是?( B )
A、scanf() B、printf() C、sum() D、max()
2、定义内部函数时,必须使用下列哪个关键字?( B )
A、extern B、void C、return D、static
3、下列选项属于函数的组成部分是?( ABCD )
A、返回值类型 B、函数名 C、参数列表 D、局部变量
4、 下列关于函数的说法正确的是?( AC )
A 、函数必须有返回值类型
B 、定义函数时必须确定参数的个数
C 、函数是C语言的基本组成元素
D 、函数不能进行嵌套调用
5、下列关于函数的调用方式,说法正确的是(多选)?( ABC )
A、可以将函数作为表达式调用
B、可以将函数作为语句调用
C、可以将函数作为实参调用
D、以上选项都错误。
四、简答题
1、请简要说明局部变量和全局变量的区别。
局部变量只能部分使用;全局变量全函数都可以用。
2、请简要说明外部函数和内部函数的区别。
外部函数可在外部c文件里使用。内部函数则不可以被其它文件调用。
五、操作题
请按照题目的要求编写程序并给出运行结果。
1、 请通过递归的方式实现1~10之间自然数的和。
2、 请编写程序一个程序来实现两个数的求和操作。
提示:
1) 在控制台提示用户输入两个整数,并获取用户输入的这两个数。
2) 在main()函数中定义num1、num2变量用于接收用户输入的两个整数。
3) 定义sum()函数来实现两个整数相加。
4) 在main()函数中调用sum()函数,输出运行结果。
原文:https://www.cnblogs.com/jidutu-kaizi/p/13833557.html