返回值

  通过函数进行数据交换的最简单方式是利用返回值。有返回值的函数会最终计算得到这个值,就像在表达式中使用变量时,会计算得到变量包含的值一样。与变量一样,返回值也有数据类型。

  例如,有一个函数 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 关键字和其后的分号之间提供返回值是错误的。

🔚