7.1 函数定义
函数的定义就是函数体的实现。函数体就是一个代码块,它在函数调用时执行。与函数定义相反,函数声明出现在函数被调用的地方。
函数声明向编译器提供该函数的相关信息,用于确保函数被正确地调用。函数定义的语法如下:
类型 函数名( 形式参数 )
代码块
回忆一下,代码块就是一对花括号里面包含了一些声明和语句(两者都是可选的)。因此,最简单的函数定义大致如下所示:
function_name()
{
}
当这个函数被调用时,它简单地返回。然而,它可以实现一种有用的存根(stub)目的,为那些此时尚未实现的代码保留一个位置。编写这类存根,或者说为尚未编写的代码“占好位置”,可以保持程序在结构上的完整性,以便于编译和测试程序的其他部分。
形式参数列表包括变量名和它们的类型声明。代码块包含了局部变量的声明和函数调用时需要执行的语句。
K&R C:
在K&R C中,形式参数的类型以单独的列表进行声明,并出现在参数列表和函数体的左花括号之间,如下所示:
int *find_int( key, array, array_len )
int key;
int array[];
int array_len;
{
这种声明形式现在仍为标准所允许,主要是为了让较老的程序无须修改便可通过编译。但我们应该提倡新声明风格,理由有二:首先,它消除了旧式风格的冗余;其次,也是更重要的一点,它允许函数原型的使用,提高了编译器在函数调用时检查错误的能力。
/*
**在数组中寻找某个特定整型值的存储位置,并返回一个指向该位置的指针。
*/
#include<stdio.h>
int *find_int( int key, int array[], int array_len )
{
int i;
/*
**对于数组中的每个位置...
*/
for( i = 0; i < array_len; i += 1 )
{
/*
**检查这个位置的值是否为需要查找的值。
*/
if( array[i] == key )
return &array[i];
}
return NULL;
}
程序7.1 在数组中寻找一个整型值 find_int.c
return语句
当执行流到达函数定义的末尾时,函数就返回(return),也就是说,执行流返回到函数被调用的地方。return语句允许从函数体的任何位置返回,并不一定要在函数体的末尾。它的语句如下所示:
return expression;
表达式expression是可选的。如果函数无须向调用函数返回一个值,表达式就被省略。这类函数在绝大多数其他语言中被称为过程(procedure)。这些函数执行到函数体末尾时隐式地返回,没有返回值。这种没有返回值的函数在声明时应该把函数声明为void。
真函数是从表达式内部调用的,它必须返回一个值,用于表达式的求值。这类函数的return语句必须包含一个表达式。通常,表达式的类型就是函数声明的返回类型。只有当编译器可以通过寻常算术转换把表达式的类型转换为正确的类型时;才允许返回类型与函数声明的返回类型不同的表达式。
有些程序员更喜欢把return语句写成下面这种样子:
return ( x );
语法并没有要求加上括号,不过在表达式两端加上括号总是合法的。
在C中,子程序无论是否存在返回值,均被称为函数。调用一个真函数(即返回一个值的函数)但不在任何表达式中使用这个返回值是完全有可能的。在这种情况下,返回值就被丢弃。但是,从表达式内部调用一个过程类型的函数(无返回值)是一个严重的错误,因为这样一来在表达式的求值过程中会使用一个不可预测的值(垃圾)。幸运的是,现代的编译器通常可以捕获这类错误。
C和指针 第7章 函数 7.1 函数定义
于 2022-06-17 19:31:57 首次发布