通过函数进行数据交换的最简单方式是利用返回值。有返回值的函数会最终计算得到这个值,就像在表达式中使用变量时,会计算得到变量包含的值一样。与变量一样,返回值也有数据类型。
例如,有一个函数 GetString()
,其返回值就是一个字符串,可以在代码中使用该函数,如下所示:
string myString; myString = GetString();
还有一个函数 GetVal()
,它返回一个 double
值,可在数学表达式中使用它。
double myVal; double multiplier = 5.3; myVal = GetVal() * multiplier;
当函数返回一个值时,可以采用以下两种方式修改函数:
-
在函数声明中指定返回值的类型,但不使用关键字
void
。 -
使用
return
关键字结束函数的执行,把返回值传送给调用代码。从代码角度看,对于我们讨论的控制台应用程序函数,其使用返回值的形式如下所示:
static <returnType> <FunctionName>() { ... return <returnValue>; }
这里唯一的限制是 <returnValue >
必须是 <returnType >
类型的值,或者可以隐式转换为该类型。但是,<returnType >
可以是任何类型,包括前面介绍的较复杂的类型。这段代码可以很简单:
static double GetVal() { return 3.2; }
但是,返回值通常是函数执行的一些处理的结果。上面的结果使用 const
变量也可以简单地实现。
当执行到 return
语句时,程序会立即返回调用代码。这个语句后面的代码都不会执行。但这并不意味着 return
语句只能放在函数体的最后一行。可以在前边的代码里使用 return
,例如放在分支逻辑之后。把 return
语句放在 for
循环、if
块或其他结构中会使该结构立即终止,函数也立即终止。
例如:
static double GetVal() { double checkVal; // checkVal assigned a value through some logic (not shown here). if (checkVal < 5) return 4.7; return 3.2; }
根据 checkVal
的值,将返回两个值中的一个。这里的唯一限制是,必须在函数的闭合花括号 }
之前处理一个 return
语句。下面的代码是不合法的:
static double GetVal() { double checkVal; // checkVal assigned a value through some logic. if (checkVal < 5) return 4.7; } ❌
如果 checkVal >= 5
,就不会执行到 return
语句,这是不允许的。所有处理路径都必须执行到 return
语句。大多数情况下,编译器会检查是否执行到 return
语句,如果没有,就给出一个错误 “并不是所有的处理路径都返回一个值”。
最后需要注意的是,return
可以用在通过 void
关键字声明的函数中(这种函数没有返回值)。如果这么做,函数在执行到 return
语句时就会立即终止。以这种方式使用 return
语句时,在 return
关键字和其后的分号之间提供返回值是错误的。