昨天开摆了,今天惩罚一下自己
使用return从函数中返回值
信息可以从主调函数传递给被调函数。反过来,函数的返回值也可以把信息从被调函数传回主函数。下面我们将创建一个返回两个参数中较小值的函数。由于函数被设计用来处理int类型的值,所以被命名为imin()。另外还要创建一个简单的main(),用于检查imin()是否正常工作。像这种设计用于测试函数的程序有时被称为驱动程序,该驱动程序调用一个函数。如果函数成功通过了测试,就可以安装在一个更重要的程序使用。程序具体如下
/* lesser.c --找出两个整数中较小的一个*/
#include <stdio.h>
int imin(int,int);
int main(void)
{
int evil1, evil2;
printf("Enter a pair of tntegers(q to quit):\n");
while (scanf("%d %d,&evil1,&evil2) ==2)
{
printf("the lesser of %d and %d is %d.\n", evil1,evil2,imin(evil1,evil2));
printf("Enter a pair of integers (q to quit):\n");
}
printf("Bye.\n");
return 0;
}
int imin(int n,int m)
{
int min;
if(n<m)
min = n;
else
min = m;
return min;
}
scanf()返回成功读取数据的个数,所以如果输入的不是两个整数会导致循环终止。下面是一个运行示例。
Enter a pair of integers (q to quit):
509 334 the lesser of 509 and 333 is 333
Enter a pair of integers (q to quit):
-9393 6
the lesser of -9393 and 6 is -9393
Enter a pair of integers (q to quit):
q
Bye.
关键字return后面的表达式的值就是函数的返回值。在该例中,该函数返回的值就是变量min的值。因为min是int类型的变量,所以imin()函数类型也是int。
注意:变量min属于imin()函数私有,但是return语句把min的值传回给了主调函数。
下面这条语句的作用是把min的值赋给lesser:
lesser = imin (n,m);
是否可以写成这样:
imin(n,m);
lesser = min;
答案是不可以,因为主调函数甚至不知道min的存在。记住,imin()中的变量是imin()的局部变量。函数调用imin(evil1,evil2)只是把两个变量拷贝了一份
其他要点
- 返回值不仅可以赋给变量,也可以被用作表达式的一部分。例如
answer = 2 * imin(z, zstar) +25;
printf("%d\n",imin(-32 + answer,LIMIT));
- 返回值不一定是变量的值,也可以是任意表达式的值。还可以用以下代码简化上述程序示例。
imin(int n,int m)
{
return (n < m) ? n : m
}
- 条件表达式的值是n和m中的较小者,该值要被返回给主调函数。虽然这里不要钱用圆括号把返回值括起来,但是如果想让程序条理更清楚,可以把返回值放在圆括号内。
如果函数返回值类型与函数声明的类型不匹配会怎么样?例如:
int what_if (int n)
{
double z = 100.0 / (double) n;
return z;
}
实际得到的返回值相当于把函数中指定的返回值赋给与函数相同的变量所得到的值。因此在本例中,相当于把z的值赋给int类型的变量,然后返回int类型变量的值。
- 使用return语句的另一个作用是,终止函数并把控制返回给主函数的下一条语句。因此,可以这样编写imin():
/*返回最小值第三个版本*/
imin(int n,int m)
{
if (n< m)
return n;
else
return m;
}
大部分C程序员认为只在函数末尾用一次return比较好,因为这样做更方便浏览程序的人理解程序的控制流。但是,在函数中使用多个return语句也没有错。
此外,还可以这样用return
return;
这条语句会终止函数,并把控制返回给主调函数。因为return后面没有任何表达式,所以没有返回值,只有void函数才会用到这种形式