C语言之函数

在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

printf()函数和scanf()函数

       在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()函数),它不属于哪个函数,而是属于源程序。所以全局变量能够为程序中全部函数共用。它的有效范围从定义开始到源程序结束。

相关文章
相关标签/搜索