我可以在返回 void 的函数中使用 return 语句吗?

问题描述 投票:0回答:9

我必须返回到之前的递归级别。下面的语法对吗?

void f()
{
   // some code here
   //
   return;
}
c++ return language-lawyer void
9个回答
115
投票

是的,您可以从 void 函数返回。

有趣的是,您还可以从 void 函数返回 void。例如:

void foo()
{
  return void();
}

正如预期的那样,这与普通的

return;
相同。这可能看起来很深奥,但原因是为了模板一致性:

template<class T>
T default_value()
{
  return T();
}

这里,

default_value
返回类型为T的默认构造对象,并且由于能够返回
void
,所以即使当
T
=
void
时它也能工作。


15
投票

当然。您只是不应该返回实际值。


10
投票

是的,您可以使用该代码从函数返回。 (我必须在这里非常详细,以免 Stack Overflow 说我的答案太短)


4
投票

是的,这将从函数返回到上一层递归。这将是非常基本的解释,但是当您调用函数时,您正在创建一个新的调用堆栈。在递归函数中,您只需添加到该调用堆栈即可。通过从函数返回,无论是否返回值,都会将堆栈指针移回到堆栈上的前一个函数。它有点像一堆盘子。你不断地在上面放盘子,但返回时会移动顶板。

您还可以使用调试器来验证这一点。只需在代码中放置几个断点并单步执行即可。您可以自己验证它是否有效。


3
投票

这个问题的简单答案是肯定的! C++ 将 void 方法识别为不返回的函数。它基本上告诉编译器,无论发生什么,一旦你看到

return;
中断并离开该方法......


3
投票

是的,有时您可能希望返回 void() 而不是什么都不返回。

考虑一个 void 函数,它想要调用一些传递 void 函数,而不需要一堆 if-else。

return 
  InputEvent == E_Pressed ? Controller->Grip() :
  InputEvent == E_Released ? Controller->Release() :
  InputEvent == E_Touched ? Controller->Touch() : void();

2
投票

你不应该在那里有return,程序会自己返回到上一个函数,进入调试模式并单步执行,你可以自己看到。 另一方面,我认为返回那里根本不会损害该计划。


1
投票

正如其他人所说,是的,你可以。在此示例中,返回不是必需的,而且其用途值得怀疑。我认为你指的是函数中间的提前返回。您也可以这样做,但这是不好的编程习惯,因为它会导致复杂的控制流(不是单入口单出口),以及诸如break之类的语句。相反,只需使用 if/else() 等条件跳过函数的其余部分即可。


0
投票

是的,例如:

void foo()
{
    // do smth
}

然后

void bar(bool condition)
{
    if (condition) {
        return foo(); //its ok
    }
    // else do smth
}
© www.soinside.com 2019 - 2024. All rights reserved.