函数参数
在上一篇的程序lethead1.c中,输出结果是这样的,文字如果能居中效果会更好
/*lethead2.c*/
#include<stdio.h>
#include<string.h>
#define NAME "GIGATHINK,INC"
#define ADDRESS "101 Megabake Plazz"
#define PLACE "Megapolie, CA 94904"
#define WIDTH 40
#define SPACE ' '
void show_n_char(char ch, int num); //函数原型体
int main (void)
{
int spaces;
show_n_char('*', WIDTH); //用符号常量作为参数
putchar('\n');
show_n_char(SPACE, 12); //用符号常量作为参数
printf("%s\n", NAME);
spaces = (WIDTH - strlen(ADDRESS))/2; //计算要跳过多少空格
show_n_char(SPACE, spaces); //用一个变量作为参数
printf("%s\n", ADDRESS);
show_n_char(SPACE, (WIDTH - strlen(PLACE))/2) ;
printf("%s\n", PLACE);
show_n_char('*', WIDTH); //用一该表达式作为参数
putchar('\n');
return 0;
}
void show_n_char(char ch, int num){//定义函数
int count;
for(count = 1; count <= num; count++){
putchar(ch);
}
}
运行结果如下:
我们来分析一下如何实现:
假设可用的空间是40个字符宽,调用show_n_char('*', 40) ,打印的是一行40个“*”。使得文字居中,就要对空格进行处理。“GIGATHINK,INC”这段文字一共13个字符宽,为了让文字居中,左边要13个空格,右边要14个空格,因此可以调用show_n_char(' ',13)。
show_n_char()和starbar()很相似,但是show_n_char()带有参数
函数的定义从下面这个带有ANSI C风格(这是个什么样的风格?我也不知道。。。)的函数头开始:
show_n_char(char ch, int num)
该行告知编译器show_n_char()使用两个参数ch和num,同时告知了他们的数据类型char和int。这两个变量被称为形式参数(形参,在前面的文章里介绍过),形参是局部变量由函数私有。
ANSI C要求每个变量前面都声明其类型(风格出现了),通过两个例子就知道了
//函数头:
void show_n_char(char ch, int num) //有效!
void show_n_char(char ch, int num, i, j) //无效!
还有一种形式的声明,不过已经逐渐被淘汰了
//函数头:
void show_n_char(ch, inum) //有效!
char ch;
int num;
接下来介绍如何使用函数
在使用函数之前要声明函数原型:
void show_n_char(char ch, int num); //函数原型体
当函数接受参数时函数原型用逗分割的列表表示了接受的参数类型和个数,变量名可以省略。
void show_n_char(char , int ); //函数原型体
声明过函数,接下来就是调用函数
函数调用中实际参数提供了ch 和 num 的值
show_n_char(SPACE, 12);
两个值赋给形参。形参是被调函数中的变量,实参是主调函数中赋给被点函数的具体值。无论实参是何种形式,都要求被求值后再交给形参
show_n_char(SPACE, (WIDTH - strlen(PLACE))/2) ;
这一行的第二个实参是一个式子,对该表达式quizhi的结果是多少,就赋给形参num多少。实参一定是具体的值。同时,因为被调函数使用的是从主调函数拷贝来的值,所以无论该值在被调函数中怎么折腾都与主调函数中的原始值没有影响。
书上将被调函数比喻成一个黑盒,是非常恰当的。核心思想在于无论是ch、num还是count,都是show_n_char()私有的,即使 主调函数中变量名与之相同也无所谓,因为主调函数看不见被调函数中的变量名(他们在黑盒中)。对于被调函数而言也是这样的。
前面讲到都是把信息从主调函数传递给被调函数,被调函数同样可以把信息传递给主调函数。
/*lesser.c -- 找出两个整数中较小的一个*/
#include <stdio.h>
int imin(int, int);
int main(void)
{
int evil1, evil2;
printf("Enter a pair of integers (q to quit):\n");
while(scanf("%d %d", &evil1, &evil2) == 2){
printf("The lesser of %d and %d is %d.", evil1, evil2, imin(evil1, evil2));
printf("Enter a pair of integers (q to quit):\n");
}
printf("Bey!\n");
return 0;
}
int imin(int n, int m)
{
int min;
if (n<m){
min = n;
}else{
min = m;
}
return min;
}
运行结果为:
关键字return后面就代表返回值,程序中的返回值就是min 的值,因为min是int类型的,所以imin()函数的类型也是int类型。可以将返回值赋给变量
lesser = imin(evil1, evil2);
这样的形式是正确的,其实质是将min的是赋给了lesser,但不可以写成
lesser = min;
这是错误的。正如前面所说的,这里的min是imin()函数这个黑盒中的东西,main()是看不见的,程序会报错。
函数返回值也可以作为表达式的一部分,就像这样:
show_n_char(SPACE, (WIDTH - strlen(PLACE))/2) ;
返回值不一定使变量的值,也可以是表达式的值,因此原程序中imin()函数可以简化为:
int imin(int n, int m)
{
return (n < m) ? n : m;
}
这是return语句的一个用法,return语句还可以直接终止函数,并返回给主函数的下一条语句,因此imin()函数还可以这样:
int imin(int n, int m)
{
if (n<m){
return n;
}else{
return m;
}
}
怎么写可以根据个人喜好,反正都没有出错,但是个人觉得原版的方式更容易让人接受一些。