在本节中我们来详细讲述一下函数的参数表与返回值。在定义一个函数时我们就需要确定这个函数的参数表及返回值。
一、参数表
参数表就是我们在调用这个函数时对它的输入内容,通过对函数的输入,使得函数在不同输入的情况下有着不同的输出,也就是返回值。例如我们定义一个用于计算两个变量之和的函数:
int plus(int a, int b)
{
return a + b;
}
int main(int argc, char *argv[])
{
int c = 3, d = 5;
int e = add(c, d);
printf("%d\n", c, e);
return 0;
}
我们在定义函数时为函数定义了两个参数,a和b,而在调用它时给这个函数传入了两个变量c和d。其中a和b为函数的形式参数,而c和d是函数调用的实际参数。也就是说当函数被调用时,c的值传递给了a,d的值传递给了b,所以a的值为3,b的值为5。而在函数体中,函数将计算3与5的和,并通过返回语句return将结果返回。
函数的实际参数只是将变量的值传递到了函数中,函数将值保存到形式参数中,并使用这些变量。而在函数内部修改形式参数的值,并不会影响到函数外部的实际参数,例如:
int wrongplus(int a, int b)
{
a++;
b++;
return a + b;
}
int main(int argc, char *argv[])
{
int c = 3, d = 4;
int e = wrongplus(c, d);
printf("%d\n", c, e);
return 0;
}
上面例子中主函数main中定义的两个变量a和b是实际参数,而wrongplus中参数表中的a和b是是形式参数,在函数内部对形式参数做修改并不会影响到外部的实际参数,所以在函数内部的a和b的值分别为4、6,而函数外部的a和b的值仍然为3、5。
二、函数的返回值
函数的返回值就是当这个函数被调用执行结束之后向函数调用者返回的一个结果。注意,与参数表不同,一个函数可以有多个输入参数,但只能有一个返回结果。
函数需要用return语句来定义其返回值,return语句后的表达式将作为函数的返回值,而这个值必须要与定义函数时的返回值类型一致。例如我们来定义一个计算并返回三个变量中较大值的函数:
int max(int a, int b, int c)
{
int m;
if (a > b && a > c)
{
m = a;
}
else if (b > a && b > c)
{
m = b;
}
else
{
m = c;
}
return m;
}
int main(int argc, char *argv[])
{
printf("%d\n", max(1, 5, 6));
return 0;
}
注意,当return语句执行之后,当前函数也就执行结束了。当前函数体中return语句后面的程序将不会被执行。
另外,我们在函数体内部定义的变量max只在函数的内部有效,而在函数外部是无法使用函数内部定义的变量的。关于变量的生存周期我们将在后续章节中学习。
我们把上面程序做一些修改:
int max(int a, int b, int c)
{
if (a > b && a > c)
{
return a;
}
if (b > a && b > c)
{
return b;
}
return c;
}
三、无参函数与无返回值函数
函数可怕被定义成无参数类型或是无返回值类型的。当函数没有参数表是,可以使用void关键字来对函数的参数表做定义。当函数没有返回值时,也可以通过void来定义函数的返回值类型。例如:
float pi_value(void)
{
return 3.141562654;
}
void display_value(int v)
{
printf("%d\n", v);
}
同样我们还可以定义一个即无参数表也无返回值的函数:
void hello(void)
{
printf("Hello World!\n");
}
另外,当没有参数表时,小括号中的void可以省略,例如:
void hello()
{
printf("Hello World!\n");
}
欢迎关注公众号:编程外星人