5

我对编程非常陌生,并且对 void 的作用感到困惑,我知道当您将 void 放在函数前面时,这意味着“它什么也不返回”但是如果函数什么都不返回,那么编写函数的意义何在? ? 无论如何,我在作业中遇到了这个问题,并试图回答它,但需要一些关于一般概念的帮助。任何帮助都会很棒,请尽量避免使用技术术语,我是这里的新手。

这个函数有什么作用?

void add2numbers(double a, double b) 
    { 
       double sum; 
       sum = a + b; 
    }
4

10 回答 10

8
void ReturnsNothing() 
{
     cout << "Hello!";
}

如您所见,此函数不返回任何内容,但这并不意味着该函数什么也不做。

函数只不过是将常用例程组合在一起的代码重构。如果我经常打印“Hello”,我会将打印“Hello”的代码放在一个函数中。如果我正在计算两个数字的总和,我将编写代码来执行此操作并在函数中返回结果。这都是关于你想要什么。

于 2012-05-21T18:53:28.803 回答
5

拥有 void 函数的原因有很多,其中一些具有“非纯”副作用:

int i=9;
void f() {
    ++i;
}

在这种情况下i,可以是全局或类数据成员。

另一个是可观察的效果

void f() {
    std::cout <<"hello world" << std::endl;
}

void 函数可以作用于引用或指针值。

void f(int& i) {
   ++i;
}

它也可以抛出,尽管不要这样做以进行流量控制。

void f() {
   while(is_not_broke()) {
        //...
   }
   throw std::exception(); //it broke
}
于 2012-05-21T18:54:53.180 回答
3

void函数的目的是实现一个副作用(例如,修改引用参数或全局变量,执行I/O等系统调用等),而不是返回值。

于 2012-05-21T18:53:26.643 回答
2

在 C/C++ 的上下文中使用术语函数相当令人困惑,因为它不同意作为“返回值的东西”的函数的数学概念。C/C++ 调用的返回 void 的函数对应于其他语言中的过程概念。

函数和过程的主要区别在于函数调用是一个表达式,而过程调用是一个语句,而函数被调用是为了它们的返回值,而过程是为了它们的副作用而调用的(例如产生输出,改变状态,等等)。

于 2012-05-21T18:56:54.580 回答
1

具有 void 返回值的函数对于它的副作用很有用。例如考虑标准库函数exit

void exit(int status)

此函数不会向您返回任何值,但它对于终止进程的副作用仍然很有用。

于 2012-05-21T18:54:09.990 回答
1

该功能一无所获-但是如果您编写了

void add2numbers(double a, double b, double &sum) 
{        
   sum = a + b; 
}

它会给你总和,是否更容易返回值或使用参数取决于函数

通常,如果有多个结果,您会使用一个参数,但假设您有一个可能无法回答的数学例程。

bool sqrt(double value, double &answer)
{
   if value < 0.0 ) {
      return false;
   } else {
      answer = real_sqrt_function(value);
      return true;
   }
}
于 2012-05-21T18:54:12.247 回答
1

你在正确的路线上 - 该函数没有完成任何事情,因为它计算了一些东西,但是一些东西然后被扔掉了。

返回 void 的函数可能很有用,因为它们可能具有“副作用”。这意味着发生的事情不是函数的输入或输出。例如,它可以写入文件或发送电子邮件。

于 2012-05-21T18:55:57.437 回答
1

在这种情况下,函数有点用词不当。也许称它为一种方法更好。您可以调用对象上的方法来更改其状态,即其字段(或属性)的值。因此,您可能有一个具有 x 和 y 坐标属性的对象和一个名为 Move 的方法,该方法采用参数 xDelta 和 yDelta。

使用 2、3 调用 Move 将导致 2 添加到您的 X 属性,并将 3 添加到您的 Y 属性。所以对象的状态已经改变,Move 返回一个值是没有意义的。

于 2012-05-21T19:04:12.413 回答
0

你是完全正确的:计算一个什么都不返回的函数是没有意义的——如果你在谈论数学函数。但与许多数学概念一样,“函数”在许多编程语言中仅与数学函数相关,但行为或多或少有细微的不同。

我相信最好用一种不会弄错的语言来解释它Haskell就是这样一种语言。那是一种纯粹的函数式语言,这意味着 Haskell 函数也是一个数学函数。事实上,您可以编写更数学风格的 Haskell 函数,例如

my_tan(x) = sin(x)/cos(x)          -- or (preferred):    tan' x = sin x / cos x

比在 C++ 中

double my_tan(double x) { return sin(x)/cos(x); }

但是,在计算机程序中,您不只是想计算函数,对吗?您还想完成一些事情,例如在屏幕上显示某些内容,通过网络发送数据,从传感器读取值等。在 Haskell 中,这些事情与纯函数很好地分开,它们都在所谓的IOmonad中起作用. 例如,putStrLn打印一行字符的函数有 type String -> IO()。意思是,它接受 aString作为它的参数并返回一个操作,当从函数IO调用时打印出该字符串,没有其他内容(括号大致是C++ 中的内容)。main()void

这种做 IO 的方式有很多好处,但大多数编程语言都比较草率:它们允许所有函数做 IO,也可以改变程序的内部状态。因此,在 C++ 中,您可以简单地拥有一个 function void putStrLn(std::string),它还“返回”一个打印字符串的 IO 操作,但没有明确告诉您。这样做的好处是,在考虑 IO monad 的实际含义时,您不需要在大脑中打多个结(它相当迂回)。此外,如果您能够真正告诉机器“现在就执行这个过程序列!”,那么许多算法都可以运行得更快。而不是仅仅在 IO monad 中询问一些计算的结果。

于 2012-05-21T19:39:05.293 回答
0

我目前使用一个名为VTK的可视化库。我通常编写 void 函数来更新显示在屏幕上的图形的某些部分。我还使用 void 函数来处理 Qt 中的 GUI 交互。例如,如果您单击一个按钮,GUI 上的某些文本会更新。

于 2012-05-21T19:10:09.020 回答