Cprogramming 简明教程

Functions in C

C 中的函数是一个有组织的可重用代码块,用于执行单个相关操作。每个 C 程序至少有一个函数,即 main() ,并且所有最简单的程序都可以定义其他函数。

当某个问题的算法涉及又长又复杂的逻辑时,它就会被分解成更小、更独立的可重用模块。这些小的代码块在不同的编程语言中称为不同的名称,如 modulesubroutinefunctionmethod

您可以将你的代码分为独立的功能。根据不同功能分割代码的方法由你决定,但从逻辑上讲,这样的划分是每个功能执行一项特定任务。

一个函数 declaration 向编译器声明一个函数的名称、返回类型和参数。一个函数 definition 提供函数的实际主体。

C 标准库提供了许多可以供您的程序调用的内置函数。例如, strcat() 拼接两个字符串, memcpy() 将一个内存地址复制到另一个地址,以及更多功能。

Modular Programming in C

函数被设计为执行一个作为整个过程一部分的特定任务。这种软件开发方法被称为 modular programming

模块化编程采用自上而下的方法进行软件开发。编程解决方案有一个主例程,通过它调用较小的独立模块(函数)。

每个函数是一个独立、完整且可重用的软件组件。调用时,函数执行指定的任务并返回对调用例程的控制权,还可以选择返回其进程的结果。

这种方法的主要优点是代码易于遵循、开发和维护。

Library Functions in C

C 语言提供许多 library functions ,包括在不同的 header files 中。例如, stdio.h 标题文件包括 printf() 和 scanf() 函数。类似地, math.h 标题文件包含许多函数,如 sin()、pow()、sqrt() 等。

这些函数执行预定义的任务,可以在任何程序中根据要求调用它们。但是,如果您没有找到合适的功能库来服务您的目的,则可以定义一个。

Defining a Function in C

在 C 语言中,有必要提供任何函数的原型的正向声明。函数库原型的存在于相应标题文件中。

对于用户自定义函数,其原型存在于当前程序中。函数的定义及其原型声明应匹配。

在函数中的所有语句执行完毕后,程序的流将返回到调用环境。函数可能会随着流控制返回一些数据。

Function Declarations in C

function declaration 告诉编译器函数名称和如何调用函数。函数的实际主体可以单独定义。

一个函数声明有以下部分 −

return_type function_name(parameter list);

对于上述定义的函数 max(),函数声明如下所示 -

int max(int num1, int num2);

参数名称在函数声明中并不重要,只要求其类型,所以以下内容也是有效的声明 -

int max(int, int);

当你在一个源文件中定义函数并在那另一个文件中调用此函数时需要进行函数声明。在这种情况下,您应该在调用函数的文件顶部声明函数。

Parts of a Function in C

C 编程语言中函数定义的常规形式如下 -

return_type function_name(parameter list){

   body of the function
}

C 编程中的函数定义包括函数头和函数体。以下是函数的所有部分 -

  1. Return Type - 函数可以返回值。return_type 是函数返回的值的数据类型。某些函数执行所需的运算而不会返回值。在这种情况下,return_type 是关键字 void。

  2. Function Name − 这是函数的实际名称。函数名称和参数列表一起构成函数签名。

  3. Argument List - 参数(也称为形式参数)就像一个占位符。当调用函数时,您可以将值作为参数传递。此值称为实际参数或自变量。参数列表引用函数参数的类型、顺序和数量。参数是可选的;也就是说,函数可以不包含任何参数。

  4. Function Body − 函数主体包含一系列的陈述,定义了函数所做的事情。

C 语言中的函数应该有返回值类型。函数返回变量的类型必须是函数的返回类型。在上图中,add() 函数返回 int 类型。

Example: User-defined Function in C

在本程序中,我们使用了名为 max() 的用户定义函数。该函数接受两个参数 num1num2 ,并返回两者之间的最大值 −

#include <stdio.h>

/* function returning the max between two numbers */
int max(int num1, int num2){

   /* local variable declaration */
   int result;

   if(num1 > num2)
      result = num1;
   else
      result = num2;

   return result;
}

int main(){
   printf("Comparing two numbers using max() function: \n");
   printf("Which of the two, 75 or 57, is greater than the other? \n");
   printf("The answer is: %d", max(75, 57));

   return 0;
}

当您运行此代码时,它将生成以下输出 −

Comparing two numbers using max() function:
Which of the two, 75 or 57, is greater than the other?
The answer is: 75

Calling a Function in C

在创建 C 函数时,您将对该函数的作用给出定义。要使用函数,您将必须调用该函数来执行已定义的任务。

要正确调用函数,您需要遵守函数原型的声明。如果函数被定义为接收一组参数,则必须传递相同数量和类型的参数。

当函数被定义为带参数时,函数名前面的参数被称为 formal arguments 。当调用函数时,传递给它的参数是 actual arguments

当程序调用函数时,程序控制被转移到被调用的函数。被调用的函数执行定义的任务,当执行其 return 语句或达到其函数结尾闭合大括号时,它将程序控制权返回到主程序。

Example: Calling a Function

要调用函数,您只需将所需的参数与函数名一起传递即可。如果函数返回一个值,那么您可以存储返回的值。请看以下示例 −

#include <stdio.h>

/* function declaration */
int max(int num1, int num2);

int main (){

   /* local variable definition */
   int a = 100;
   int b = 200;
   int ret;

   /* calling a function to get max value */
   ret = max(a, b);

   printf( "Max value is : %d\n", ret );

   return 0;
}

/* function returning the max between two numbers */
int max(int num1, int num2){

   /* local variable declaration */
   int result;

   if (num1 > num2)
      result = num1;
   else
      result = num2;

   return result;
}

我们将 max() 与 main() 一起保留并编译源代码。在运行最终可执行文件时,它将生成以下结果 −

Max value is : 200

The main() Function in C

C 程序是由一个或多个函数组成的集合,但其中一个函数必须被命名为 main() ,它是程序执行的入口点。

在 main() 函数内部,将调用其他函数。main() 函数可以调用库函数(例如带有原型从头文件 (stdio.h) 或代码中存在的任何其他用户定义函数的 printf())。

在 C 中,程序定义的顺序并不重要。在一个程序中,无论何时有 main(),它都是入口点,不管它是否作为第一个函数存在。

Note: 在 C 中,任何函数都可以随时多次调用任何其他函数。一个函数也可以调用它自己。这样的自调用函数被称为 recursive function

Function Arguments

如果一个函数要使用参数,则它必须声明接收参数值的变量。这些变量称为函数的 formal parameters

形式参数的行为类似于函数内的其他局部变量,并在进入函数时被创建,并在退出函数时被销毁。

在调用函数时,可以用两种方法将参数传递给函数 −

Sr.No

Call Type & Description

1

Call by value 此方法将参数的实际值复制到函数的形式参数中。在这种情况下,对函数内参数所做的更改不会影响该参数。

2

Call by reference 此方法将参数的地址复制到形式参数中。在函数内部,该地址用于访问调用中使用的实际参数。这意味着对参数所做的更改将影响参数。

默认情况下,C 使用 call by value 传递参数。一般来说,这意味着函数内的代码无法更改用于调用函数的参数。