在C语言中,大多数功能都是靠函数来实现的,定义一个函数的具体格式以下:
返回值类型 函数名([[参数类型 参数名1], [参数类型 参数名2],..., [参数类型 参数n]])
{
执行语句
.........
return 返回值;
}
释义:
返回值类型:用于限定函数返回值的数据类型;
函数名:表示函数的名称,该名称能够根据标识符命名规范来定义;
参数类型:用于限定调用方法时传入参数的数据类型;
参数名:用于接收调用方法时传入的数据;
return关键字:用于结束函数,并返回函数指定类型的值;
返回值:被return语句返回的值,该值返回给调用者。若是函数没有返回值,则返回值类型要声明为void,此时,函数体中的return 语句能够省略不写。
在以上语法中,函数中的“[[参数类型 参数名1],[参数类型 参数名2],...[参数类型 参数n]]”被称做参数列表,它用于标水函数在调用时须要接收的参数。若是函数不须要接收任何参数,则参数列表为空,这样的函数被称为无参函数。若是参数列表不为空的函数就是有参函数。以下两种函数:
无参函数: 在C语言中,无参函数的定义很简单,定义以下:
void func()
{
printf("hello word");
}
上述代码中,func()函数就是一无参函数,在定义时参数列表为空,要想执行这个函数须要在main()函数中调用它。以下程序员
#include <stdio.h> //定义函数 void func() { printf("hello word!\n"); } int main(int argc, const char * argv[]) { func(); //打印hello word return 0; } 运行结果: hello word! Program ended with exit code: 0
有参函数
与无参函数函数相比,有你参函数函数须要在定义时,在函数名称后面的括号中填写参数。所谓的参数是一个变量,用于接收调用函数传入的数据。
void func(int x, int y)
{
int sum = x + y;
printf("sum = %d\n", sum);编程
}
以上代码是两个整数之和,以下:数组
#include <stdio.h> //定义函数 void func(int x, int y) { int sum = x + y; printf("sum = %d\n", sum); } int main(int argc, const char * argv[]) { func(3, 5); //打印hello word return 0; } 运行结果以下: sum = 8 Program ended with exit code: 0
函数的返回值数据结构
函数的返回值是指函数被调用以后,返回给调用者的值,函数返回值的具体语法格式上以下:
return 表达式;
对于返回值为空的函数,能够直接在return语句后面加分号,具体语法格式以下:
return;
有返回值的函数以下示例:
函数
#include <stdio.h> //定义函数 int func(int x, int y) { int sum = x + y; return sum; } int main(int argc, const char * argv[]) { int sum = func(3, 5); //打印hello word printf("sum =%d\n", sum); return 0; } 运行结果 sum =8 Program ended with exit code: 0
在C语言中,常常会进行一些输入输出操做,为此,C语言提供了printf()和scanf()函数,其中,printf()函数用于控制台输出字符,scanf()函数用于读取用户的输入。spa
printf()函数
在前面章节中,常用printf()函数输出数据,它能够经过格式控制字符输出多个任意类型的数据。以下:
code
经常使用格式字符 | 含义 |
%s | 输出一个字符串 |
%c | 输出一个字符 |
%d | 以十进制输出一个有符号整型 |
%u | 以十进制输出一个无符号整型 |
%o | 以八进制输出一个整数 |
%x | 以十六进制输出一个小写整数 |
%X | 以十六进制输出一个大写整数 |
%f | 以十进制输出一个浮点数 |
%e | 以科学计数法输出一个小写浮点数 |
%E | 以科学计数法输出一个大写浮点数 |
scanf()函数
scanf()函数负责从控制台上接收用户的输入,它能够灵活接收各类类型的数据,如字符串、字符、整型、浮点数等,scanf()函数也能够经过格式控制字符控制用户的输入,其用法和printf()函数同样。以下示例:递归
#include <stdio.h> int main(int argc, const char * argv[]) { //输入一个字符串, 用字符数组保存字符串 char string[256]; scanf("%s", string); printf("%s\n", string); return 0; } 运行结果 dqk dqk Program ended with exit code: 0
以上代码运行后输入dqk并按回车键 而后控制台会打印出结果:dqk.
注意:C语言中的终止符
在使用scanf()函数获取用户输入信息时,若是输入的信息包含某个终止符,scanf()函数就会认为输入结束。以下一些常见的终止符:ci
字符 | 含义 |
0x20 | 空格 |
\t | 水平制表符(tab键) |
\n | 换行 |
\v | 垂直 |
\f | 换页 |
\r | 回车 |
函数是c语言的基本组成元素,要想实现函数的功能,必须学会正确调用函数。在c语言中,调用函数的具体语法格式以下:
函数名([[实参列表1], [实参列表2]......])
从上面的语法格式能够看出,当调用一个函数时,须要明确函数名和实参列表。实参列表中的参数能够是常量、变量、表达式或者空,各参数之间使用英文逗号分隔。
根据函数在程序中出现的位置,能够有下列三种函数调用方式:
1.将函数做为表达式调用
将函数做为表达式调用时,函数的返回值参与表达式的运算,此时要求函数必须有返回值。示例代码以下:作用域
int sum = func(100, 4);
2.将函数做为语句调用
函数以语句的形式出现时,能够将函数做为一条语句进行调用。示例代码以下:
printf("哈哈哈 今天是周五");
3.将函数做为实参调用
将函数做为另外一个函数的实参,要求该函数有返回值,示例代码以下:
printf("%d\n", func(100, 5));
嵌套调用
在c语言中函数的定义是独立的,即一个函数不能定义在另一个函数内部。但在调用函数时,能够在一个函数中调用另外一个函数,这就是函数的嵌套调用。示例代码以下:
#include <stdio.h> //求两个数的和 int func1(int x, int y) { return x + y; } //求两个数之差 int func2(int x, int y) { //调用函数1先求两个数之和 int sum = func1(x, y); return sum - y; } int main(int argc, const char * argv[]) { //输入一个字符串, 用字符数组保存字符串 int s = func2(10, 5); printf("%d\n", s); return 0; } 运行结果: 10 Program ended with exit code: 0
脑洞大开:函数调用时最多能够嵌套多少层?
有没有这个疑问:“既然函数嵌套调用和普通的调用看上去没有什么区别,那是否是能够无限层的函数嵌套呢?”很遗憾,函数能够嵌套调用多少层是由程序运行时一个名为“栈”的数据结构决定的。通常而言,Windows上程序的默认栈大小大约为8KB,每一次函数调用至少占用8个字节,所以粗略计算下,函数调用只能只能嵌套大约一千层,若是嵌套调用的函数里包含许多变量和参数,实际值要远远小于这个数目。
固然,单纯手动书写代码写出一千层嵌套函数调用基本是不可能的,可是一种名为“递归的方法能够轻松达到这个上限。
递归调用
所谓的递归就是函数内部调用自身的过程。须要注意的是,递归必需要求有结束条件,否则就会陷入无限递归的状态,永远没法结束调用。接下来经过一个求1~100天然数之间的和来做为一个案例,示例代码以下:
#include <stdio.h> int getsum(int n) { if (n == 1) { return 1; } int temp = getsum(n-1); return temp + n; } int main(int argc, const char * argv[]) { //打印天然数之和 printf("%d\n", getsum(100)); return 0; } 运行结果 5050 Program ended with exit code: 0
前面关于函数的调用都是针对同一个源文件中其它函数进行调用的,在有些状况下,函数也可能对另一个源文件中函数进行调用。当一个程序由多个源文件组成时,根据函数时可否被其它源文件调用,将函数分为内部函数和外部函数。
外部函数
开发大型项目时,为了便于团队的协同工做;,须要把一个项目拆分红不少源文件来分别实现,最终再把它们整合在一块儿。为了减小重复代码,一个源文件有时须要调用其余源文件中定义的函数。在c语言中,能够被其它源文件调用的函数称为外部函数,在调用外部函数以前,须要在当前源文件中定义外部函数。定义外部函数的方式是在函数的返回值类型前面添加extern关键字,示例代码以下:
extern int sum(int x, int y);
在上述示例代码中,编译会经过extern关键字知道sum()函数时是定义在其余文件中的外部函数。请看代码:
peresion.c 源文件:
#include "persion.h" int sum(int x, int y){ int sum = x + y; return sum; }
main.c 主函数文件:
extern int sum(int x, int y); int main(int argc, const char * argv[]) { int y = sum(100, 10); printf("%d\n", y); return 0; }
运行结果:
110 Program ended with exit code: 0
为简化编程,C语言中容许在定义外部函数时省略关键字extern。在以上例子中外部函数sum()也能够修改成下面的代码:
int sum(int x, int y);
上述代码由函数的返回类型、函数名和参数列表组成,这类格式的代码被称为函数原型。当代码中包含函数原型时,可能会有下列两种状况:
1.程序员但愿编译器自动从其余文件中查找该函数的定义。
2.程序员先定义未实现的空函数,而后在其余文件中具体实现
内部函数
相对外部函数,外部函数只要声明一个函数原型就可以调用其余源文件中的函数。可是当多人参与开发一个项目时,颇有可能会出现函数重名的状况,这样,不一样源文件中重名的函数就会互相干扰。此时,就须要一些特殊函数,这些函数只在它定义文件中有效,该类函数称为内部函数。
在定义内部函数时,须要在函数的返回值类型前面添加static关键字(又称为静态函数),示例代码以下:
static void eat(int x) { printf("%d", x); }
请看以下案例:
persion.c源文件:
#include "persion.h" void eat(int x){ x += x; printf("小狗吃了%d个馒头", x); }
main.c 主函数源文件:
#include <stdio.h> static void eat(int x) { printf("小猪吃了%d个馒头\n", x); } int main(int argc, const char * argv[]) { eat(10); return 0; }
运行结果:
小猪吃了10个馒头 Program ended with exit code: 0
以上代码中在persion.c文件和main.c源文件中都定义了eat()函数,从运行结果中能够看出打印的是main.c文件中的eat()函数,所以说明内部函数只会被自身调用,不会受到其余文件中同名函数的影响。
变量既能够定义在函数内,也能够定义在函数外。定义在不一样位置的变量,其做用域也是不一样的。C语言中的变量,按做用域范围可分为局部变量和全局变量。
局部变量
局部变量就是在函数内部声明的变量,它只在本函数内有效,也就是说,只能在本函数内使用它。此外,局部变量只有当它所在的函数被调用时才会被使用,而当函数调用结束时局部变量就会失去做用。
全局变量 在全部函数外部定义的变量称为全局变量(包含main()函数),它不属于哪个函数,而是属于源程序。所以全局变量能够为程序中全部函数共用。它的有效范围从定义开始到源程序结束。