关于return的用法的C ++函数

时间:2015-07-02 16:27:10

标签: c++ function c++11 return

您好我对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

4 个答案:

答案 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)(即使调用语法非常相似)。作为程序员,您只需定义xy是什么以及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是一个网站,可以帮助您了解函数的基础知识,包括有关返回类型的信息。