C语言学习与总结---第七章:函数 [01]

函数 [01]

  • 7.1 函数
  • 7.2 函数的定义
  • 7.3 函数调用
    • 7.3.1 函数调用的形式
    • 7.3.2 函数调用时的数据传递
    • 7.3.3 函数调用过程
    • 7.3.4 函数返回值
  • 7.4 函数声明和函数原型
  • 7.5 函数的嵌套调用

7.1 函数

C语言函数可以分为标准库函数和自定义函数。标准库函数是C语言出厂自带的,可以直接调用的,但注意要写文件包含;自定义函数是自己编写自己调用的函数。例如

#include   //标准输入输出库函数  
void printN(int n);  //声明函数printN  
int main()           //主函数  
{  
    int n;  
    printN(n);      //调用函数printN  
    return 0;  
}  
void printN(int n)  //定义函数printN  
{  
    printf("....\n");  
} 

注意
(1)函数间可以互相调用,但不能调用main函数。main函数是系统调用的。
(2)C程序的执行是从main函数开始的,如果在main函数中调用其他函数,在调用后流程返回到main函数,在main函数中结束整个程序的运行。
(3)从函数的形式: 无参函数、有参函数

7.2 函数的定义

定义无参函数的一般形式为:

类型标识符 函数名()
{
  声明部分
  语句部分
}

定义有参函数的一般形式为:

类型标识符 函数名(形式参数表列) 
{
  声明部分
  语句部分
}

定义空函数的一般形式为:

类型标识符 函数名() 
{
}

7.3 函数调用

7.3.1 函数调用的形式

函数调用的一般形式为:

函数名(实参表列)

如果是调用无参函数,则“实参表列”可以没有,但括弧不能省略
(1)函数语句
把函数调用作为一个语句。这时不要求函数带回值,只要求函数完成一定的操作
(2)函数表达式
函数出现在一个表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。
(3)函数参数
函数调用作为一个函数的实参。
例如:

m = max (a , max ( b , c ) ) ;
printf ("%d", max (a, b));

7.3.2 函数调用时的数据传递

定义有参函数时,函数名后面括弧中的变量名称为“形式参数”(简称“形参”);
调用有参函数时,函数名后面括弧中的参数称为“实际参数”(简称“实参”);return后面的值作为函数带回的值(称函数返回值);.
通过函数调用,使两个函数中的数据产生联系 。

#include  
int max(int x, int y);        //声明函数max  
int main()  
{  
    int a, b, c;  
    scanf_s("%d,%d", &a, &b);  
    c = max(a, b);           //调用函数max,通过定义函数,将函数返回值赋给变量c  
    printf("max = %d\n", c);  
    return 0;  
}  
int max(int x, int y)       //定义函数max  
{  
    int z;  
    z = x > y ? x : y;  
    return(z);              //函数返回int类型值  
} 

7.3.3 函数调用过程

实参向形参的数据传递是“值传递”,单向传递。只能由实参传给形参,而不能由形参传回来给实参。

在内存中,实参单元与形参单元是不同的。 在执行一个被调用函数时,形参的值如果发生改变,并不会改变主调函数中实参的值。这也就是为什么用函数交换两个数的值时要使用指针的原因。

7.3.4 函数返回值

(1)在定义函数时要指定函数返回值的类型。例如

int  max(float x,float y)       // 函数值为整型
char  letter(char c1,char c2)     // 函数值为字符型 
double  min(int x,int y)     	 // 函数值为双精度型 
void  fun(double x,int y) 	    // 无函数值

(2)如果函数值的类型和return语句中表达式的类型不一致,则以函数类型为准

/*函数类型是int型,但是返回值是float型,则函数调用时的类型为int型*/  
#include  
int max(int x, int y);  
int main()  
{  
    float a, b;  
    int c;  
    scanf_s("%f,%f", &a, &b);  
    c = max(a, b);             
    printf("max = %d\n", c);  
    return 0;  
}  
int max(int x, int y)       
{  
    float z;  
    z = x > y ? x : y;  
    return(z);            
}

7.4 函数声明和函数原型

在一个函数中调用另一个函数需要具备的条件:
(1)首先被调用的函数必须是已经存在的函数(是库函数或用户自己定义的函数)
(2)如果使用库函数,应该在本文件开头用#include命令将函数库“包含”进来
(3)如果使用自己定义的函数,而被调用的函数的位置在即主调函数的后面,应该在主调函数中对被调用的函数作声明

函数原型的一般形式为:
(1)

函数类型 函数名(参数类型1 参数名1,参数类型2 参数名2,……);

(2)

函数类型 函数名(参数类型1, 参数类型2,……);

声明的作用

把函数名、函数参数的个数和参数类型等信息通知编译系统,以便在遇到函数调用时,编译系统能正确识别函数并检查调用是否合法。
例如:函数名是否正确,实参与形参的类型和个数是否一致
注意:函数的“定义”和“声明”不是一回事

函数的定义

对函数功能的确立,包括指定函数名,函数值类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。

函数的声明

把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统进行对照检查

(1)如果被调用函数的定义出现在主调函数之前,可以不必声明。因为编译系统已经知道了被调用函数的有关信息

#include  
float add(float x, float y)  
{  
    float z;  
    z = x + y;  
    return(z);  
}  
int main()  
{  
    float a, b, c;  
    scanf_s("%f,%f", &a, &b);  
    c = add(a, b);             
    printf("max = %5.2f\n", c);  
    return 0;  
} 

(2)如果已在文件的开头,对本文件中所调用的函数进行了声明,则在各函数中不必对其所调用的函数再做声明

7.5 函数的嵌套调用

嵌套调用函数:在调用一个函数的过程中,又调用另一个函数
C语言学习与总结---第七章:函数 [01]_第1张图片
例,输入4个整数,找出其中的最大值。要求用函数的嵌套调用实现。

#include  
int max2(int w, int x, int y, int z);  
int main()  
{  
    int a, b, c, d, max;  
    printf("Please enter 4 integers:\n");  
    scanf_s("%d,%d,%d,%d", &a, &b, &c, &d);  
    max = max2(a, b, c, d);  
    printf("\nThe largest is: %d\n", max);  
    return 0;  
}  
  
int max2(int w, int x, int y, int z)  
{  
    int max1(int x, int y);  
    int max;  
    max = max1(w, x);  
    max = max1(max, y);  
    max = max1(max, z);  
    return max;  
}  
int max1(int x, int y)  
{  
    int z;  
    z = x >= y ? x : y;  
    return z;  
}

运行结果
C语言学习与总结---第七章:函数 [01]_第2张图片

你可能感兴趣的:(C语言,函数)