C语言:函数(上)

1.自定义函数

在数学当中,我们学过很多函数,如 三角函数 y  = sin x,二次函数 y = f(x)...它们都有一个共同特点,即有参数 x , 和经过函数 f(x) 运算(处理)后的返回值 y,那么在C语言中的函数该如何编写呢?

事实上,C语言的函数编写也遵循这样一个规律,即函数包含它的参数并且最多有且仅有一个函数的返回值,具体定义一个函数的操作就是:

返回值类型 函数名(参数1,参数2,参数3,...)

{

     函数体语句1;

     函数体语句2;

     ......

        return 表达式(返回值)
}
注意:函数的定义结尾没有分号。

这里,函数的返回值类型可以是我们知道的各种数据类型,例如int,char,float,double,long long等等,这些都是C语言自带的数据类型,当然,还有一个比较特殊的类型 void 它的意思是函数的返回值类型为 “空” ,即函数可以返回一个空类型,或者干脆没有返回值。

例如:编写一个求取最大值的函数,经过分析可知,我们要通过函数获得一个最大值,因此需要函数有一个返回值,所以函数返回值类型不能为空(void),这里我们默认要返回一个整型的最大值,定义是这样的:

int max(int a,int b)

{

        if(a > b) return a;

        return b;
}

这样我们就实现了两个整数求取最大值的过程,这里有几个点还需指明,例如,我们的函数只有两个参数,那如果我们要求三个数的最大值或者四个数的最大值甚至是五个,六个等等,那我们是不是需要在函数的参数列表里再多定义几个 int c,int d,int e...呢?想了想那么复杂,所以显然是不用的,为什么不用,这个问题留在后期解答。还有一点,就是关于这个函数体中的语句,我们看到函数体里面只有一个 if 判断语句,而没有出现它的难兄难弟 else ,为什莫?其实关键就在于 return 语句,return 语句在函数体中是老大哥一样的存在,为什莫这么说呢,因为一旦函数执行到return语句,函数就退出了,所以,在本函数体中,如果a > b 条件满足,返回a,否则编译器就不会执行return a 这条语句,顺序往下执行,遇到return b,返回b的值,函数执行完毕。但其实在return b,前面加上else 也是可以的,这里只是手懒而已。

提示:函数的参数和返回值类型最好是我们 “常见的数据类型” ,如int ,char double,当然,后期认识了指针,结构体,类等数据类型也可以作为函数的参数和返回值,只不过它们的作为参数和返回值要相对复杂些,如果函数不要返回值,则返回值类型应该写为 void ,而不是空着返回值类型,直接写函数名。

2.自定义函数的几种类型

1 返回值类型 函数名(参数...){      }    有返回值 有参数

2 返回值类型 函数名(          ){      }    有返回值 无参数

3 void 函数名 (参数...)          {      }    无返回值 有参数

4 void 函数名 (          )          {      }    无返回值 无参数

3.函数的声明

当我们定义了一个函数,要去使用这个函数的时候,就需要对函数进行调用,但有些情况下,即使我们已经已经在程序定义了这个函数,但当我们去使用它的时候,程序有时会报错说[Error] '函数名' was not declared in this scope,这个时候,往往是我们把函数定义在了主函数的后面,当程序执行到主函数里面的语句时,程序不知道后面还有一个我们事先定义好的函数,这时候,就用到了函数声明,具体声明形式时这样的:返回值类型 函数名 (参数);将对应代码声明语句像这样在主函数中放在要调用该函数语句的前面,程序遇到该声明语句就会在程序中寻找相关的函数定义,这样一来,函数就可以在主函数中正常使用了。当然,有没有一种方法可以让我们省略函数的声明语句呢?答案是可以的,我们只需要将函数的定义放在主函数前面就可以在主函数中不用声明也可以直接调用了。

4.函数的参数传递

当我们要使用一个带有参数的自定义函数时,我们必须传递给函数的形式参数一个实参,在上例

int max (int a,int b){  函数体} 类型中,a , b就是形式参数,当我们调用这个函数时,需要传递给函数两个实际参数,多一个少一个都不行,比如我们有两个变量 num1 = 10,num2 = 1;要对比两个数的大小,就需要在程序中有这样的语句:int c = max(num1,num2); c 用来接收num1,num2两个数中的较大值,在这个过程当中 num1的值传递给了 a ,num2 的值传递给了 b,这种参数之间的传递,就叫做参数的值传递,函数参数的传递类型有三种,值传递,地址传递,引用传递,其中值传递只是简单的将实际参数的值复制给了形式参数,这种参数之间值传递的方式中,形式参数和实际参数之间互不影响,即如果形式参数的函数值在函数体当中有所改变,不会影响到主函数中的实际参数。

例如:现在我们需要编写一个函数来实现两个变量之间的值交换。

#include<stdio.h>

void swap(int a,int b)

{

         int t = a;

         a = b;

         b = t;

}

int main()

{

        int a = 3,b = 4;

        swap(a,b);

        printf("a = %d\nb = %d ",a,b);

}

可以看到,在我们事先定义的swap()函数中,我们将传进来的变量a 和 b 的值借助 t 变量进行了交换,但当我们运行这段代码后会发现,主函数中打印的 a 和 b 的值依然是 3 和 4,这就是所谓的参数之间进行了值传递,形式参数的改变不会影响主函数当中的实际参数的值。那么怎么修改才能实现两个实际参数之间的值交换呢,感兴趣的同学可以去了解一下C语言指针部分的讲解,由于我这里仅针对部分学基础的同学,所以这里我只给出代码,不做过多解释。

#include<stdio.h>

void swap(int * a,int * b)
{
    int t = *a;
    *a = *b;
    *b = t;
}
int main()
{
    int a = 3,b = 4;

    swap(&a,&b);

    printf("a = %d\nb = %d",a,b);
    
    return 0;
}
​

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值