【问题标题】:Can I return in void function?我可以在 void 函数中返回吗?
【发布时间】:2011-01-15 23:40:59
【问题描述】:

我必须回到递归的上一层。下面的语法是正确的吗?

void f()
{
   // some code here
   //
   return;
}

【问题讨论】:

  • 你试过编译吗?
  • @Mitch: 合理的是,它只证明你的编译器支持它,而不是它是否真的是有效的C++。例如。我可以很容易地“证明”void main() 这样是正确的。

标签: c++


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    是的,您可以使用该代码从函数返回。 (这里我必须非常冗长,才能让 Stack Overflow 不会说我的答案太短)

    【讨论】:

    • IIRC 你曾经可以用空格填充它:-)
    • 您可以使用省略号来填充几个字符,(15) 可以为您提供更多功能,同时清楚地表明您只是为了填充而这样做。
    【解决方案3】:

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

    【讨论】:

    • 是的,你是对的。尽管不知道此处引用的某些代码指的是什么,但明确表示可能是有意义的。尽管右大括号之前的返回是无关紧要的。
    【解决方案4】:

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

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

    【讨论】:

    • 堆栈框架。新线程获得新堆栈,函数调用在给定线程的同一堆栈上获得新堆栈帧。只是想弄清楚那个细节,因为它可能会让新手感到困惑。
    【解决方案5】:

    对此的简单回答是肯定的! C++ 将 void 方法识别为没有返回的函数。它基本上告诉编译器无论发生什么,一旦你看到 return; 中断并离开该方法....

    【讨论】:

      【解决方案6】:

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

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

      void foo()
      {
        return void();
      }
      

      正如预期的那样,这与普通的return; 相同。这可能看起来很深奥,但原因是模板一致性:

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

      这里,default_value 返回一个默认构造的 T 类型对象,并且由于能够返回 void,即使在 T = void 时它也可以工作。

      【讨论】:

      • 如果在 return 指令中调用一个返回 void 的函数,是不是同样的事情?例如返回 f();其中 f 的原型是 void f();
      • 哦等等,所以这个构造函数有 void( void ) 签名?所以return void( void() ) 也是有效的。代码混淆竞赛有人吗?
      • 这是否也适用于例如我有一个void foo();,在void bar(),我有return foo()
      • 哦,这很奇怪。当我们从不需要实例化函数模板时,为什么 T() 需要为 T = void 工作?
      【解决方案7】:

      正如其他人所说,是的,你可以。在这个例子中,return 不是必需的,并且有问题地服务于目的。我认为您所指的是函数中间的早期返回。您也可以这样做,但是这是不好的编程习惯,因为它会导致复杂的控制流(不是单入口单出口)以及诸如 break 之类的语句。相反,只需使用 if/else() 等条件语句跳过函数的其余部分。

      【讨论】:

        【解决方案8】:

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

        考虑一个 void 函数,它想在没有一堆 if-else 的情况下调用一些传递 void 函数。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-25
          • 2015-08-08
          • 2019-11-30
          • 1970-01-01
          • 2022-12-04
          相关资源
          最近更新 更多