大家好,又见面了,我是你们的朋友全栈君。
在前面内容中我们调用了一个标准C的库函数,叫printf,那么如果我们想自己定义函数应该如何来编写程序呢?定义函数又有什么好处呢?因为我们在教材中提及到的例子主要目的是为了让读者对程序的原理有一定的了解,所以设定的例子程序通常都比较简单,基本上在几行到十几行,多一点的也就三五十行代而已,但是在真正的编程工作中,我们需要完成的代码将非常大,所以将代码合理的分为不同的区块是很有必要的,每一个区块具有相对独立的功能,并为其它程序提供对外调用的参数和返回值,这样由多个区域组成的程序才会让程序阅读者更方便的理解程序设计的理念。并可以通过函数让功能被封装起来,使得一个功能可以在不同的情况下被其它功能调用,函数的概念就是这样产生的。我们来看看函数的定义与使用。
一、定义函数
定义一个函数我们需要确定三部分内容:
1.函数的返回值类型
2.函数的名称
3.函数的参数
确定了以上内容后就可以定义一个特有功能的函数了:
int wrongplus(int a, int b)
{
a = a + 1;
b = b + 1;
return a + b;
}
例如上面代码中就定义了一个返回值为int类型的函数,其函数名为wrongplus,一对小括号中的内容为这个函数的参数,也就是说这个函数有两个传入参数int a和int b。在函数体内,分别让a在原来的基础上加1,让b在原来的基础上加1,然后使用return关键字返回a + b的和。如果a的值是2,而b的值是3,那么这个函数的返回值则是7。
如果我们想定义一个没有返回值类型的函数则需要设计其返回值类型为void,同样,如果我们想定义一个没有参数的函数可以将其参数定义为void,通常如果一个函数没有参数可以在函数名后的小括号里什么都不写,例如:
void function1(void)
{
}
void function2()
{
}
二、函数调用与声明
我们定义了这样一个wrongplus()的函数,那么如何来让其它功能使用它呢?我们看下面程序:
#include <stdio.h>
main()
{
int a = 2, b = 3;
int c;
int wrongplus(int a, int b);
c = wrongplus(a, b);
printf("%d + %d = %d\n",a, b, c);
}
int wrongplus(int a, int b)
{
a = a + 1;
b = b + 1;
return a + b;
}
2 + 3 = 7
如果函数的定义是在调用函数的后面(下面)则需要在调用之前声明函数的定义,否则不需要事先声明。声明的意思是告诉编译器,这个函数的返回值类型、函数名和参数。
我们在调用一个函数时,需要向这个函数传其需要的参数,例如a和b这两个变量,并可以指定另一个变量用于接收这个函数执行后的返回值,比如变量c就接收了函数wrongplus()的返回值,结果为7。但是我们看到程序的运行结果是 2 + 3 = 7,也就是说,执行了函数wrongplus()后,我们虽然对函数内的参数变量分别加1,但主函数main中的a和b的值并没有发生变化。
三、实参与形参
当我们调用函数时,对其传入的参数和函数体内接收到的参数其实并不是同一个变量。调用函数时向函数传入的参数称作实际参数,简称实参,而函数体内部用于接收外部调用时传入的参数的参数称为形式参数,简称形参。
例如上面例子中,在main函数中定义的变量int a和int b,在调用wrongplus(a, b);时这两变量是实参,也就是将这两个变量的值2和3传入到函数内部。而在函数wrongplus()的函数体内,用于接收这两个参数时的int a和int b则是形参,这是函数体内部额外的两个变量,用于接收2和3这两个值,这两个变量并不是main函数中定义的a和b 。
在wrongplus()函数体内,对形参做a = a + 1;和b = b + 1;操作,其实只影响到了函数体内部的这两个变量,而并未影响到main函数中的变量a和b的值。所以,在wrongplus()函数体内的a和b的值为3和4,函数运行结果的返回值为7,而在main函数中的a和b两变量的值仍然是2和3,所以printf()函数显示出的结果则是 2 + 3 = 7 。
欢迎关注公众号:编程外星人
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/147528.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...