在之前的课(2.1 -- 函数简介)中,我们指出函数定义的语法如下所示:
虽然我们展示了返回类型为 void 的函数的示例,但我们没有讨论这意味着什么。在本课中,我们将探索返回类型为 void 的函数。
返回值为 void
函数不需要将值返回给调用者。为了告诉编译器函数不返回值,返回类型为 void。例如:
在上面的例子中,printHi 函数有一个有用的行为(它打印“Hi”),但它不需要返回任何东西给调用者。因此, printHi 被赋予了一个 void 返回类型。
当 main 调用 printHi 时,执行 printHi 中的代码,并打印“Hi”。在 printHi 结束时,控制返回到 main 并且程序继续。
不返回值的函数称为
无返回值函数
(或
void 函数
)。
void 函数不需要 return 语句
void 函数不需要 return 语句
void 函数将在函数结束时自动返回给调用者。不需要 return 语句。
可以在 void 函数中使用 return 语句(没有返回值)——这样的语句将导致函数在执行return声明时返回给调用者。无论如何,这与函数结束时发生的情况相同。因此,在void函数的末尾放一个空的return语句是多余的:
Best practice
void 函数结尾不需要 return 语句
void 函数不能用于需要计算值的表达式
void 函数不能用于需要计算值的表达式
某些类型的表达式需要值。例如:
在上述程序中,需要在 std::cout << 的右侧提供要打印的值。如果没有提供值,编译器将产生语法错误。由于对 std::cout 的第二次调用没有提供要打印的值,这会导致错误。
现在考虑以下程序:
第一次调用 printHi() 是在不需要值的上下文中调用的。由于函数不返回值,这很好。
对函数 printHi() 的第二个函数调用甚至无法编译。函数 printHi 有一个 void 返回类型,这意味着它不返回值。但是,此语句试图将 printHi 的返回值发送到 std::cout 以进行打印。std::cout 不知道如何处理(它会输出什么值?)。因此,编译器会将其标记为错误。您需要注释掉这行代码才能使您的代码编译。
Tip
有些语句需要提供值,有些则不需要。
当我们单独调用一个函数时(例如上例中的第一个printHi() ),我们调用该函数是由于函数的行为,而不是它的返回值。在这种情况下,我们可以调用无返回值函数,也可以调用值返回函数并忽略返回值。
从 void 函数返回值是编译错误
从 void 函数返回值是编译错误
尝试从非值返回函数返回值将导致编译错误:
提前返回
提前返回
不是函数中最后一条语句的返回语句称为提前返回。这样的语句将导致函数在执行return语句时返回给调用者(在函数返回给调用者之前,因此是“提前”)。
在上面的例子中,当 print() 执行时,它会首先打印“A”。然后返回语句执行,控制权返回给调用者(main)。 “B”从不打印,因为语句从不执行。
早期返回也可以用于返回值的函数:
上面的程序打印以下内容:
首先,调用 print()。 print() 中的第一条语句打印“A”。然后执行 return 语句,将 5 的值返回给调用者。这个返回值也被打印出来。这个返回值也被打印出来。语句 std::cout << "B" 永远不会执行,因为该函数在该点之前已返回给调用者。
从历史上看,提前返回是不受欢迎的。然而,在现代编程中,它们更容易被接受,特别是当它们可用于使函数更简单,或用于由于某些错误条件而提前中止函数时。
相关内容
我们将在第 7.10 节课 - break 和 continue 中进一步讨论
测试时间
测试时间
Question #1
检查以下程序并说明它们输出的内容,或者它们是否无法编译。
1a)
1b)
Question #2