• C语言 函数


    一、什么是函数?

    1. C语言本身带了很多库函数,并分门别类地放在了不同的头文件中,使用时只要引入对应的头文件即可。

    2. 除了C语言自带的函数,我们也可以编写自己的函数,称为自定义函数(User-Defined Function)。自定义函数和库函数没有本质的区别,表现形式和使用方法一样,只是开发者不同而已。

    3. 数是一段可以重复使用的代码,用来独立地完成某个功能,它可以接收用户传递的数据,也可以不接收。
      无参函数的定义
      如果函数不接收用户传递的数据,那么定义时可以不带参数。如下所示:
      返回值类型 函数名(){
      函数体
      }
      说明: • 返回值类型可以是C语言中的任意数据类型,例如 int、float、char 等。
      • 函数名是标识符的一种,命名规则和标识符相同。函数名后面的括号( )不能少。
      • 函数体是函数需要执行的代码。即使只有一个语句,也要由{ }包围。
      • 在函数体中使用return语句返回数据。

    例如,定义一个函数,计算1加到100的结果:

    int sum(){
    int i, sum=0;
          for(i=1; i<=100; i++){
          sum+=i;
      }
         return sum;
     }
    

    计算结果保存在变量sum中,通过return语句返回。sum为int型,所以返回值类型也必须为int,要一一对应。

    return是C语言中的一个关键字,只能用在函数中,用来返回处理结果。

    将上面的代码补充完整:

    #include <stdio.h>
    
     int sum(){
     int i, sum=0;
      for(i=1; i<=100; i++){
        sum+=i;
      }
        return sum;
    }
    
       int main()
    {
    int a = sum();
    printf("The sum is %d
    ", a);
     return 0;
    }
    

    运行结果:
    The sum is 5050

    函数不能嵌套定义,main 也是一个函数定义,要将 sum 放在 main 外面。函数必须先定义后使用,所以 sum 只能在 main 前面。

    注意:main 是函数定义,不是函数调用。当可执行文件加载到内存后,系统从 main 函数开始执行,也就是说,系统会调用我们定义的 main 函数。

    无返回值函数
    有的函数不需要有返回值,或者返回值类型不确定(很少见),那么用void表示,例如:

    void hello(){
      printf ("Hello,world 
    ");
     //没有返回值就不需要 return 语句
    }
    

    void是C语言中的一个关键字,表示空类型或无类型,绝大部分情况下也就意味着没有 return 语句。

    有参函数的定义

    如果函数需要接收用户传递的数据,那么定义时就要带参数。如下所示:

    返回值类型  函数名(参数列表){
        函数体
     }
    

    用户数据通过“参数列表”传递给函数,供函数处理。例如,定义一个函数求两个数中的最大值:

    int max(int a, int b){
      if (a>b){
        return a;
    }else{
       return b;
     }
    }
    

    参数(Parameter)本质上也是变量,定义时要指明参数类型和参数名称。参数列表中可以定义一个或多个参数,多个参数之间用逗号,分隔。参数列表中给出的参数可以在函数体中使用。

    调用 max() 函数时可以直接传递整数: int n = max(10, 20);
    也可以传递变量: int a = 10, b = 20;
    int n = max(a, b);
    也可以整数和变量一起传递: int a = 10;
    int n = max(a, 20);
    变量 n 得到的值都是20。

    函数定义时给出的参数称为形式参数,简称形参;函数调用时给出的参数(传递的数据)称为实际参数,简称实参。函数调用时,将实参的值传递给形参,相当于一次赋值操作。注意:实参和形参的类型、数目必须一致。

    将上面的代码补充完整:

    #include <stdio.h>
    
    int max(int a, int b){
    if (a>b){
       return a;
    }else{
        return b;
      }
    }
    
    int main(){
    int num1, num2, maxVal;
    printf("Input two numbers: ");
    scanf("%d %d", &num1, &num2);
    maxVal = max(num1, num2);
    printf("The max number: %d
    ", maxVal);
    
    return 0;
    }
    

    运行结果:
    Input two numbers: 100 200
    The max number: 200

    定义max时,变量a、b的值都是未知的;调用max时,分别将num1、num2的值传递给a、b,类似于: a=num1;
    b=num2;
    return 语句可以有多个,可以在函数体的任意位置。在max中,根据 if 的判断结果来执行不同的 return 语句。

    函数一旦遇到 return 语句就返回(停止执行),后面的所有语句都不会被执行到,例如:

    int max(int a, int b){
    int n = (a>b) ? a : b;
    return n;
    printf("Function is performed
    ");
    }
    

    第4行代码是多余的,永远没有执行的机会。

    二、C语言函数的声明以及函数原型

    C语言代码由上到下依次执行,原则上函数定义要出现在函数调用之前,否则就会报错。但在实际开发中,经常会在函数定义之前使用它们,这个时候就需要提前声明。

    所谓声明(Declaration),就是告诉编译器我要使用这个函数

    函数声明的格式非常简单,相当于去掉函数定义中的函数体再加上分号;,如下所示:
    返回值类型 函数名( 类型 形参, 类型 形参… );
    也可以不写形参,只写数据类型:
    返回值类型 函数名( 类型, 类型…);
    函数声明给出了函数名、返回值类型、参数列表(参数类型)等与该函数有关的信息,称为函数原型(Function Prototype)。

    函数原型的作用是告诉编译器与该函数有关的信息,让编译器知道函数的存在,以及存在的形式,即使函数暂时没有定义,编译器也知道如何使用它。

    有了函数声明,函数定义就可以出现在任何地方了,甚至是其他文件、静态链接库、动态链接库等。

    上节给出了计算sum = 1! + 2! + 3! + ... + (n-1)! + n!的代码,这节我们稍作修改,将 factorial() 和 sum() 函数的定义放到 main() 函数后面,请看下面的代码:

    #include <stdio.h>
    
    // 函数声明
    long factorial(int n);  //也可以写作 long factorial(int);
    long sum(long n);  //也可以写作 long sum(long);
    
    int main(){
    printf("1!+2!+...+9!+10! =  %ld
    ", sum(10));
    return 0;
    }
    
      //求阶乘
    long factorial(int n){
    int i;
    long result=1;
    for(i=1; i<=n; i++){
        result *= i;
      }
      return result;
    }
    
    // 求累加的和
    long sum(long n){
    int i;
    long result = 0;
    for(i=1; i<=n; i++){
        //嵌套调用
        result += factorial(i);
      }
       return result;
    }
    

    运行结果:
    1!+2!+...+9!+10! = 4037913

    使用 printf()、puts()、scanf()、getchar() 等函数要引入 stdio.h 这个头文件,很人认为 stdio.h 中包含了函数定义(也就是函数体),只要有了头文件程序就能运行。其实不然,头文件中包含的都是函数声明,而不是函数定义,函数定义都在系统库中,只有头文件没有系统库在链接时就会报错,程序根本不能运行。

    三、程序编译过程中遇到的问题及解决

    1. viod Fun(double x、y)
      {
      .....
      }
      在函数定义时,省略了形参链表中的某些形参的类型申明。
  • 相关阅读:
    webpack浅析
    MongoDB简易
    async函数
    react -- context
    抓包移动端方法
    stateless 无状态组件
    移动端适配
    JS和JQuery获取和修改Label的值的示例代码
    HTML DOM querySelector() 方法
    filter
  • 原文地址:https://www.cnblogs.com/lyx1996/p/7223408.html
Copyright © 2020-2023  润新知