我对编程非常陌生并且对于void的作用感到困惑,我知道当你在函数前面放置void时它意味着“它什么都不返回”,但是如果函数没有返回什么,那么写什么呢?功能??无论如何,我在我的作业上得到了这个问题,并且我试图回答它,但是需要一些关于它的一般概念的帮助。任何帮助都会很棒,请尽量避免技术术语,我是一个认真的新手。
这个功能有什么作用?
void add2numbers(double a, double b)
{
double sum;
sum = a + b;
}
答案 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中的某些计算结果。