无返回值函数
本节阅读量:
函数定义的语法如下:
1
2
3
4
|
返回值类型 函数名() // 函数头,告知编译器函数的存在
{
// 函数体
}
|
本课中,将探索返回类型为void的函数。
无返回值
函数不需要将值返回给调用方时,使用返回类型void。例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include <iostream>
// void 意味着函数不返回值给调用方
void printHi()
{
std::cout << "Hi" << '\n';
// 不返回数据,所以不需要return 语句
}
int main()
{
printHi(); // 无需接收返回值
return 0;
}
|
在上面的例子中,printHi函数有一个有用的行为(打印”Hi”),但不需要向调用者返回任何内容。因此,printHi的返回类型为void。
当main调用printHi时,执行printHi中的代码,打印”Hi”。printHi结束时,控制权返回main,程序继续执行。
Void函数不需要return语句
void函数会在函数结束时自动返回给调用方,不需要return语句。
可以在void函数中使用return语句(不带返回值)——函数执行到return语句时会立即返回给调用方。这与函数末尾自动返回的效果相同。因此,无须在void函数的末尾添加空的return语句:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include <iostream>
// void 意味着函数不返回值给调用方
void printHi()
{
std::cout << "Hi" << '\n';
return; // 告诉编译器返回 -- 该语句是多余的
}
int main()
{
printHi();
return 0;
}
|
最佳实践
不需要在返回void的函数末尾添加return语句。
void函数不能在需要值的表达式中使用
某些类型的表达式需要值。例如:
1
2
3
4
5
6
7
8
9
|
#include <iostream>
int main()
{
std::cout << 5;
std::cout << ; // 编译失败, 这里需要一个能打印的值
return 0;
}
|
上述程序中,需要在std::cout«的右侧提供要打印的值。如果没有提供值,编译器将产生语法错误。由于对std::cout的第二次调用没有提供要打印的值,因此会导致错误。
以下程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include <iostream>
void printHi()
{
std::cout << "Hi" << '\n';
}
int main()
{
printHi();
std::cout << printHi(); // 编译失败
return 0;
}
|
对printHi()的第一个调用是在不需要值的上下文中调用的。函数不返回值,因此可正常运行。
对函数printHi()的第二个调用甚至无法编译。函数printHi的返回类型为void,没有返回值。然而,该语句试图将printHi的返回值发送到std::cout。std::cout无法处理这种情况(应该输出什么值?)。因此,编译器会将其标记为错误。注释掉这一行代码,才能使代码编译通过。
提示
一些语句需要提供值,而其他语句则不需要。
当单独调用函数时(例如上面示例中的第一个printHi()),需要的是函数的行为,而不是其返回值。这种情况下,可以调用返回void的函数,也可以调用有返回值的函数但忽略其返回值。
当在需要值的上下文中调用函数时(例如std::cout),则必须提供值,只能调用有返回值的函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#include <iostream>
// 无返回值
void returnNothing()
{
}
// 有返回值
int returnFive()
{
return 5;
}
int main()
{
// 在不需要返回值的上下文中调用函数
returnNothing(); // 无返回值的函数
returnFive(); // 有返回值的函数,返回值未使用
// 在需要返回值的上下文中调用函数 (例如 std::cout)
std::cout << returnFive(); // 使用函数返回值
std::cout << returnNothing(); // 编译失败:无返回值
return 0;
}
|
从void函数返回值导致编译错误
尝试从void函数中返回值会导致编译错误:
1
2
3
4
5
6
|
void printHi()
{
std::cout << "In printHi()" << '\n';
return 5; // 编译失败
}
|