递归C void函数和return关键字

时间:2014-03-13 10:42:58

标签: c recursion return void

有人知道之间的内部差异:

void RecFoo1(int bar){
  if (bar == 0)
    return ;
  RecFoo1(bar - 1);
}

void RecFoo2(int bar){
  if (bar == 0)
    return ;
  return RecFoo2(bar - 1);
}

我确信放置return关键字总是更好。如果递归函数不是void函数,则会从-Wreturn-type收到警告。但这两段代码是否以相同的方式编译/执行?机器的内部差异是什么?

我的功能示例是愚蠢的,但它构成了一种最小的例子......

3 个答案:

答案 0 :(得分:6)

C标准非常明确,您的RecFoo2示例不是有效的C程序:

  

6.3.2.2 void

     

void表达式的(不存在的)值(具有的表达式)   类型void)不得以任何方式使用,......

  

6.8.6.4返回声明

     
    

约束

  
     

带有表达式的return语句不应出现在函数中   返回类型无效。

答案 1 :(得分:2)

void函数中,return只是一个控制流操作 - 退出当前函数。您可以在函数的最后一行添加一个:

void RecFoo1(int bar){
  if (bar == 0)
    return ;
  RecFoo(bar - 1);
  return; // Unecessary!
}

但它会多余。

您的第二个查询无法编译 - 您无法在虚函数中返回值。

答案 2 :(得分:2)

没有真正的区别。实际上我希望完全没有差别,但看看这个。

比较生成的汇编代码而不进行优化(通过将-save-temps选项传递给gcc来获取它):

diff --git a/without-expr.s b/with-expr.s
index a7577f5..e346d6f 100644
--- a/without-expr.s
+++ b/with-expr.s
@@ -18,6 +18,7 @@ L2:
        decl    %eax
        movl    %eax, (%esp)
        call    _RecFoo2
+       nop
        jmp     L1
 L4:
        nop

通过优化生成的代码完全相同(我试过-O2)。

因此,如果没有优化,编译器会为带有表达式的nop生成额外的return,但它并不是您应该关注的内容。