必备技能5.4:使用return语句
在前面的示例中,函数在遇到函数体结束的右括号时才会返回到调用该函数的地方。对于大多数的函数来说,这种方式是可以接受的。但并不是所有的函数都是这样的。通常,我们需要精确地控制在什么时候函数以何种方式来返回到调用的地方。为此,我们需要使用return语句。
return 语句有两种形式:一种是返回一个值;另外一种则什么都不返回。我们将从什么都不返回的这种形式开始学些return语句。如果一个函数的返回值类型为void类型,则在该函数中可以使用不返回任何值的return语句。这种return语句的形式如下:
return;
当在函数中遇到return语句的时候,程序的执行就会立刻返回到调用该函数的地方。函数中return语句之后的所有代码都会被忽略掉。例如,研究一下下面的程序:
#include <iostream>
using namespace std;
void f();
int main()
{
cout << "Befor call\n";
f();
cout << "After call\n";
return 0;
}
//使用return语句的无返回值的函数
void f()
{
cout << "Inside f()\n";
return; //返回到调用该函数的地方
cout << "This won't display\n";
}
程序的输出如下:
Befor call
Inside f()
After call
正如程序的输出那样,函数f()在执行到return语句的时候就返回了,所以第二个cout语句是不会被执行的。
下面例子中的return相比来说更加实际一些。其中的power()函数输出一个整型数的正数次幂。如果指数是负数,那么return语句就会终止该函数的执行,避免了企图进行计算。
#include <iostream>
using namespace std;
void power(int base, int exp);
int main()
{
power(10,2);
power(10,-2);
return 0;
}
void power(int base, int exp)
{
int i;
if ( exp < 0 ) return ; //避免了企图计算指数为负数的幂
i= 1;
for (; exp; exp--) i = base * i;
cout << "The answer is : " << i;
}
程序的输出如下:
The answer is : 100
当exp为负数的时候,函数power()就直接返回了,其后面的代码就被忽略了。
一个函数中可以含有多个return语句。只要遇到其中的一个,函数就立刻返回。例如,下面的代码段是有效的:
void f()
{
//...
switch(c)
{
case 'a': return;
case 'b': //.....
case 'c': return;
}
if ( count < 100 ) return;
}
返回值
函数还可以给调用者返回一个值。因此返回值是一种函数把信息带出来的方式。带返回值的return语句的形式如下:
return 值;
其中的值就是要被返回的数值。这种形式的return语句只能用于那些返回类型不是void的函数。
一个需要返回值的函数必须指明返回值的类型。返回类型必须和return语句中返回值的类型是相兼容的。如果不兼容,编译的时候就会出现错误。函数可以返回任意有效的C++的数据类型,但是函数不能返回数组。
为了演示函数返回值的过程,我们按照下面的方式重写函数box()。在这个版本中,函数box()返回计算得到的体积。注意,其中把函数放置到一个赋值语句的右边表示把函数的返回值赋值给左侧的变量。
#include <iostream>
using namespace std;
int box(int length, int width, int height); //返回计算得到的体积
int main()
{
int answer;
answer = box(10,11,3);
cout << "The volumn is " << answer;
return 0;
}
//函数返回一个值
int box(int length, int width, int height)
{
return length * width * height;
}
程序的输出如下:
The volumn is 330
在这个实例中,函数box()中使用了return语句返回length * width * height,然后这个返回值被赋值给answer。也就是说,在调用的时候,return语句返回的值就变成了box()的值。
既然box()函数现在是返回一个值的,那么它的返回类型就不再是void的了。(请记住,void只有在函数不返回任何值的时候才使用。)而是被声明成返回一个类型为int的值。请注意,放置在函数名称之前的返回类型在函数的原型和函数的定义中都是要有的。
当然,int类型并不是唯一的函数可以返回的类型。正如前面讲到的那样,函数可以返回除了数组之外的任意类型。例如,下面的程序中,我们重写了box() 函数,它的参数为double类型,返回类型也是double类型。
#include <iostream>
using namespace std;
//使用double数据类型
double box(double length, double width, double height);
int main()
{
double answer;
answer = box(10.1,11.2,3.3 );
cout << "The volume is " << answer;
return 0;
}
//这个版本中,box函数使用double数据类型
double box(double length, double width, double height )
{
return length * width * height;
}
程序的输出如下:
The volume is 373.296
还有一点:如果在一个非空的返回值的函数中,由于遇到了函数体结束的右括号而结束,则返回值是不确定的。根据C++语言的语法,无返回值的函数并不一定需要return语句,函数在遇到函数体结束的右括号的时候就自动返回。然而,如果一个函数如果是有返回值的,那么这种遇到函数体结束的右括号而返回的值则是垃圾数据。当然,好的编程实践告诉我们,在任何非空返回值的函数中,我们都要使用return语句来明确返回值。