关于虚空和它意味着什么的混淆。

时间:2012-05-21 18:51:35

标签: c++

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

这个功能有什么作用?

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

10 个答案:

答案 0 :(得分:8)

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

正如您所看到的,此函数不返回,但这并不意味着函数没有

一个函数只不过是重构代码以将常用例程放在一起。如果我经常打印“Hello”,我会在函数中输入打印“Hello”的代码。如果我正在计算两个数字的总和,我将把代码放到并在函数中返回结果。这都是你想要的。

答案 1 :(得分: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
}

答案 2 :(得分:3)

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

答案 3 :(得分:2)

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

函数和过程之间的主要区别在于函数调用是表达式,而过程调用是语句虽然函数被调用它们的返回值,为其副作用调用过程(例如生成输出,更改状态等)。

答案 4 :(得分:1)

具有void返回值的函数可能对其副作用有用。例如,考虑标准库函数exit

void exit(int status)

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

答案 5 :(得分: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;
   }
}

答案 6 :(得分:1)

你是在正确的界限 - 该功能没有完成任何事情,因为它计算了一些东西,但那些东西然后被扔掉了。

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

答案 7 :(得分:1)

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

使用2,3调用Move将导致2添加到X属性中,3将添加到Y属性中。因此,对象的状态已经发生了变化,并且对于Move返回一个值也没有意义。

答案 8 :(得分:0)

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

答案 9 :(得分:0)

你是完全正确的:如果你在谈论数学函数,计算一个没有返回任何东西的函数是没有意义的。但与许多数学概念一样,“函数”在许多编程语言中只与数学函数有关,但行为或多或少略有不同。

我认为用一种 not 错误的语言解释它是很好的:一种语言是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中,像这样的东西与纯函数完全分离,它们都在所谓的< em> IO monad 。例如,打印一行字符的函数putStrLn的类型为String -> IO()。意思是,它需要一个String作为参数并返回一个IO动作,该动作在从main函数调用时打印出该字符串,而没有别的(() parens是大致是C ++中的void

这种做IO的方式有很多好处,但大多数编程语言都比较草率:它们允许所有函数执行IO,并且还可以更改程序的内部状态。所以在C ++中,你可以简单地使用一个函数void putStrLn(std::string),它也“返回”一个IO动作,打印字符串而不是其他内容,但是没有明确告诉你。这样做的好处是,在考虑IO monad实际上是什么时,你不需要在你的大脑中打结多个结(它相当迂回)。此外,如果您能够实际告诉机器“现在执行此序列的过程!”,可以实现许多算法以更快地运行。而不只是要求IO monad中的某些计算结果。