您好我对c ++编程完全陌生,我在使用int函数时遇到了一个问题为什么我们必须使用return命令,就像我们可以使用cout << sum << endl;
并调用main()
中的函数一样。但对于返回,我们必须像cout << printSum();
案例1:
#include <iostream>
using namespace std;
int addNumbers(int x, int y){
int sum = x + y;
cout << sum << endl;
}
int main() {
addNumbers(4, 5);
return 0;
}// without using return
案例2:
#include <iostream>
using namespace std;
int addNumbers(int x, int y){
int sum = x + y;
return sum;
}
int main() {
cout << addNumbers(4, 5) << endl;
return 0;
}// return method
答案 0 :(得分:1)
int
函数必须返回int
。如果您不想返回值,可以使用void
函数:
#include <iostream>
using namespace std;
void addNumbers(int x, int y){
int sum = x + y;
cout << sum << endl;
}
int main() {
addNumbers(4, 5);
return 0;
}
main()
必须返回int
(标准),这意味着程序成功运行(0)。您甚至可以将return
语句从main()
中删除,但它将返回零(隐式)。
#include <iostream>
using namespace std;
void addNumbers(int x, int y){
int sum = x + y;
cout << sum << endl;
}
int main() {
addNumbers(4, 5);
}
答案 1 :(得分:1)
return
声明似乎非常基本,但事实上,这是我们当地大学新生学习过程中最令人费解的方面之一。
函数是过程和函数编程语言的构建块。对于某些操作,您可能会想到可重复使用,可维护代码负责的function。如果经常一起执行某些操作,您可能希望将它们“打包”到函数中。 “好”功能是一台小型机器,可以获取一些输入数据并返回处理后的数据。
在C ++中,您可以通过return
值,修改参数(更糟糕)或修改全局状态(最差)来“共享”处理结果和“外部代码”。
在简单的情况下,“返回”函数是数学函数的直接类比,如y = f(x)
(即使调用语法非常相似)。作为程序员,您只需定义x
,y
是什么以及f
如何将x
映射到y
。
现在,打印到控制台(终端)和return
不一样。简单来说,打印只是向用户显示屏幕上的一些字符(“与用户交谈”)。从函数返回允许从函数接收结果(“与外部代码说话”),但除非您之后打印,否则它对用户是不可见的。
(并不假装是详尽的清单)
因此,在您的课程或教程中,有时他们会教您如何
(1)直接在main()
int main() {
int i = 42 + 13;
std::cout << i << std::endl;
}
(2)在函数内打印一个对象
void printSum(int a, int b) {
int i = a + b;
std::cout << i << std::endl;
}
int main() {
printSum(42, 13);
}
(3)从函数返回一个对象并随后打印
void sum(int a, int b) {
return a + b;
}
int main() {
int s = sum(42, 13);
std::cout << s << std::endl;
}
显然,(1)根本不可重用:要更改参数,必须干预程序逻辑。此外,如果逻辑不仅仅是一个总和,main()
函数的大小会快速增长并变为unmaintainable。责任将分散在整个代码中,违反了Single responsibility principle
(2)各个方面都比较好:函数将逻辑封装在代码中的一个单独的位置,具有独特的名称,可以与主函数分开更改。可以使用不同的值调用函数,并且更改参数不会更改函数。
但它仍有2个职责:执行计算并输出到屏幕。如果您不想打印结果但将其写入文件怎么办?或通过网络发送?或者只是丢弃它?您需要编写另一个函数。这个新函数内部的逻辑是相同的,因此引入了重复和违反DRY principle。此外,(2)不是纯函数,因为它正在修改std::cout
,它基本上是全局状态(我们说这个函数有“副作用”)。
此外,您可以将(2)视为(1),但整个程序逻辑从main()
移动到单独的函数中(这就是为什么有时函数被称为“子程序”)。
(3)通过摆脱打印(将其移动到“用户代码”)来解决多重责任问题。该函数仅包含纯逻辑。现在它是一台数字运算机。在主函数中,您可以决定如何处理计算结果而不触及计算功能。它变成"black box"。无需担心它是如何实现的,也不需要改变任何东西,它只是有效。
在你的帖子中有一个较短版本的(3):
int main() {
std::cout << sum(42, 13) << std::endl;
}
不同之处在于没有创建临时对象int s
,但返回值正在直接写入std::cout
(事实上,作为参数传递给名为operator<<的函数)< / p>
在现实生活中,大多数时候你会编写像(3)这样的函数,它们不会打印任何东西。打印到终端只是一种可视化数据的快速而简单的方法。这就是为什么你被教会如何输出到标准流而不是写入文件,网络套接字或显示GUI小部件。控制台打印在调试过程中也非常方便。
另见:
P.S。这篇文章有很多简化,因此使用了很多引用的术语。
答案 2 :(得分:0)
您的两个片段中都有两个略微的不同场景。
案例1:在函数完成执行之前,您正在从被调用函数中打印值。所以,你没有(需要)return
任何价值。因此,您不需要return
声明。
案例2:您期望函数为return
将被打印的值。因此,您需要在被调用的函数中使用return
。
答案 3 :(得分:0)
这是因为函数的返回类型。有时你想要一个函数来给你一个结果,而不是仅仅使用你输入的信息。
就像一个变量有一个类型如int和string,一个函数想要一个它将返回的项的类型。
Here是一个网站,可以帮助您了解函数的基础知识,包括有关返回类型的信息。