如果在递归返回函数中没有使用return,会发生什么?

时间:2016-11-11 18:55:56

标签: c recursion

#include <stdio.h>
int lcm(int ,int );
int main()
{
   int a,b,f;
   printf("Enter the numbers:");
   scanf("%d %d",&a,&b);
   f=lcm(a,b);
   printf("LCM of %d and %d : %d",a,b,f);
   return 0;
}

int lcm(int a,int b)
{
    static int x=1;
    if(x%a==0 && x%b==0)
        return x;
    x++;
    lcm(a,b);
}

现在,这段代码没有给出任何错误......并给出了正确的答案,但是如果没有lcm函数中的返回键盘,该值是如何返回主函数的  &#34; LCM(A,B); &#34; !请解释!!

1 个答案:

答案 0 :(得分:1)

  

现在,这段代码没有给出任何错误......并且给出了正确答案,但是如果没有lcm函数lcm(a,b)中的返回键盘,该值是如何返回到main函数的;

C语言允许不正确的代码,让你自己射击。这称为undefined behaviour。您的代码显示除(1,1)之外的任何参数的未定义行为。传递(1,1)时,第一次触发第一次返回。

您应该阅读What Every C Programmer Should Know About Undefined Behavior以获取一些详细的解释和示例。

话虽如此,忽略返回值本身并不是未定义的行为。它的未定义调用者使用函数的返回值。 例如,您已经忽略了代码中scanf()printf()函数的返回值,但它们是有效的。虽然,如果扫描成功,您应该检查scanf()的返回值!在相关说明中,scanf() use is discouraged in C因为它容易出错。

但在您的代码中,您确实使用了返回值(f=lcm(a,b);)。因此,存在未定义的行为(具有上述例外情况)。

但是,如果您要将lcm() main的呼叫写为:

 scanf("%d %d",&a,&b);
 lcm(a,b);
 ...

然后不会有任何未定义的行为(尽管它在你的程序中不会有用)。